焦点非对齐移动
默认tvOS焦点移动是需要移动方向上有能获取焦点的button,假如button是左右靠边对齐的,就移动不上去。需要使用focusSetion
把button所在的整行范围变成可焦点识别的,才能自动移动到靠边的button上。
示例:
VStack {
HStack {
Button {} label: {
Text("test")
}
}
.frame(maxWidth: .infinity, alignment: .trailing)
.focusSection()
Button {} label: {
Text("Save")
}
}
实现Parralw效果
需要使用开源库ParallaxView编写自定义控件实现
优化滚动列表性能
SwiftUI滚动列表中有异步加载的图片时,向下快速滚动会停顿,不能持续滚动,看着像是tvOS焦点切换到indicator时出现了问题。要解决只能改为使用UICollectionView来实现滚动列表,推荐使用第三方开源的ASCollectionView或SwiftUIX来实现。
tabbar随内容滚动
需要借助Introspect库
import Foundation
import SwiftUI
import SwiftUIIntrospect
struct TabBarScrollModifier: ViewModifier {
func body(content: Content) -> some View {
content.introspect(.viewController, on: .tvOS(.v16, .v17, .v18), scope: .ancestor) { viewController in
if let scrollView = findScrollView(in: viewController.view) {
viewController.setContentScrollView(scrollView, for: .top)
}
}
}
private func findScrollView(in view: UIView) -> UIScrollView? {
if let scrollView = view as? UIScrollView {
return scrollView
}
for subview in view.subviews {
if let found = findScrollView(in: subview) {
return found
}
}
return nil
}
}
extension View {
func tabBarScroll() -> some View {
modifier(TabBarScrollModifier())
}
}
在内容的ScrollView中调用:
ScrollView {
// content
}
.tabBarScroll()
参考资料:
onLongPressGesture导致跳转失效
假如在 NavigationLink
上使用 onLongPressGesture
,那么 NavigartionLink
的跳转会失效
NavigationLink{
EmptyView()
} label: {
Text("Click")
}
.onLongPressGesture {
// 加上这句会没法触发跳转
print("long press")
}
看网上说法这是appletv的bug,可在 onLongPressGesture
前面加上 onPlayPauseCommand
来避免这问题
NavigationLink{
EmptyView()
} label: {
Text("Click")
}
.onPlayPauseCommand {
// fixed navigate!!!
}
.onLongPressGesture {
print("long press")
}
如何本地修改导入的swift package
需要把swift package先下载到本地,然后在finder中找到文件夹,直接拖到xcode项目根目录中
这样修改本地代码,就可以在xcode中看到修改后的效果