我有一个图像视图,当包含的视图获得焦点时,它将获得令人敬畏的 tvOS 焦点效果。 问题是 - 它应该有圆角。现在这很容易完成:
imageView.layer.cornerRadius = 5
imageView.layer.masksToBounds = true
我必须将图层的
masksToBounds
或图像视图的 clipsToBounds
设置为 true (基本相同),以便剪切图像的边缘 - 但一旦我这样做,焦点效果将不再起作用,因为它也会被剪切。
我对按钮或多或少有相同的问题,但由于焦点效果比图像视图简单得多(仅缩放和阴影),所以我自己实现了它,但这不是图像视图的选项,应用了所有效果(移动、闪烁等......)
有更简单的方法吗?我错过了什么?我不能是唯一一个试图弄清楚这是如何工作的人!? :)
我找到了替代解决方案。人们可以做的就是实际绘制图像,用 Alpha 通道剪掉角落。聚焦后图像会正确缩放。这适用于图层。然后,要将 Alpha 通道添加到其他图层(例如用于发光效果的图层),我们需要进行设置; “masksFocusEffectToContents = true”。
我根据这个answer:
为其做了扩展斯威夫特4.2
extension UIImageView {
func roundedImage(corners: UIRectCorner, radius: CGFloat) {
let rect = CGRect(origin:CGPoint(x: 0, y: 0), size: self.frame.size)
UIGraphicsBeginImageContextWithOptions(self.frame.size, false, 1)
UIBezierPath(
roundedRect: rect,
byRoundingCorners: corners,
cornerRadii: CGSize(width: radius, height: radius)
).addClip()
self.draw(rect)
self.image = UIGraphicsGetImageFromCurrentImageContext()!
// Shadows - Change shadowOpacity to value > 0 to enable the shadows
self.layer.shadowOpacity = 0
self.layer.shadowColor = UIColor.black.cgColor
self.layer.shadowOffset = CGSize(width: 10, height: 15)
self.layer.shadowRadius = 3
// This propagate the transparency to the the overlay layers,
// like the one for the glowing effect.
self.masksFocusEffectToContents = true
}
}
然后应用圆角:
myImageView.adjustsImageWhenAncestorFocused = true
myImageView.clipToBounds = false
// masks all corners with a radius of 25 in myImageView
myImageView.roundedImage(corners: UIRectCorner.allCorners, radius: 25)
显然可以修改 roundedImage() 以添加参数来在调用时定义阴影。
缺点:
另外,tvOS 12(目前为测试版)引入了 Lockup。我设法以编程方式实现它们,如这个答案所示。
https://forums.developer.apple.com/thread/20513
我们也面临着同样的问题。当你圆角时,你可以看到“光泽”仍然是矩形。
我在多伦多的技术讲座上向开发布道者展示了这个问题,他们说这是一个错误。据报道并打开rdar://23846376
导入
TVUIKit
以使用 TVPosterView
。
幸运的是
TVPosterView
现在效果很好。这可能是您的最佳解决方案。只需在 TVPosterView` 上设置 .image
。
您也可以仅使用
UICardView
来达到效果。 (在这种情况下,只需将 UIImageView 放入卡片视图中即可。不要忘记在 image view 上实际关闭“调整祖先焦点”和“启用用户交互”,否则当卡片视图扩大!)
使用
TVPosterView
,您在玩弄遥控器时可以获得“两种”3D 效果。
与
UICardView
不同,在玩弄遥控器时您只能获得“一种”3D效果。尝试一下,看看有什么不同。
但是...
使用
TVPosterView
,您确实会遇到奇怪的问题(与仅图像视图一样),图像根本无法正确缩放,它会忽略缩放模式。
使用
UICardView
图像将正常缩放(无论您如何指示),就像在 iOS 上一样