很多都是 tvOS 的紀錄,部分 macOS 和 iOS 的紀錄。有部分 Bug 我依然還沒找到妥善的解決辦法。
Text(text)
.textStyleCaption2(lineLimit: 2)
.lineBreakMode(.byCharWrapping)
.fixedSize(horizontal: false, vertical: true)
struct InternalLabelView: UIViewRepresentable {
var text: String
@Binding var dynamicHeight: CGFloat
func makeUIView(context: Context) -> UILabel {
let label = UILabel()
label.numberOfLines = 2
label.lineBreakMode = .byCharWrapping
label.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
label.font = .systemFont(ofSize: 20, weight: .regular)
label.adjustsFontSizeToFitWidth = false
return label
}
func updateUIView(_ uiView: UILabel, context: Context) {
uiView.text = text
DispatchQueue.main.async {
dynamicHeight = uiView.sizeThatFits(CGSize(width: uiView.bounds.width, height: CGFloat.greatestFiniteMagnitude)).height
}
}
}
使用 SwiftUI 的 Text 實現方法,lineBreakMode 並沒有正確生效。
如果不使用 Delay Run 就會導致無限卡住在第一個焦點位置。
使用 Delay 就會循環在第一張圖和選中的焦點來回切換。
.focused($Focused)
.onChange(of: Focused) { newValue in
if newValue {
print("...", item.recentTitle)
DelayRun.task(delay: 0.6) {
appStatus.MainViewBackgroundURL = backgroundImageURL?.description ?? ""
}
}
}
不知道。最後使用 UIKit 方案解決。
func collectionView(_ collectionView: UICollectionView, didUpdateFocusIn context: UICollectionViewFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
if let indexPath = context.nextFocusedIndexPath {
RecentBackground.setMainBackground(byIndex: indexPath.row)
}
}
tvOS 16.4
tvOS 16.1
在 tvOS 16.4 下,如果你的按鈕是點擊後會變換 icon 的話,會產生焦點跳走。