tvOS:聚焦时图像视图的圆角

cr4*_*ide 5 xcode uiimageview apple-tv tvos

我有一个图像视图,当包含视图聚焦时,将获得这个令人敬畏的tvOS焦点效果.问题是 - 它应该有圆角.现在这很容易做到:

imageView.layer.cornerRadius = 5
imageView.layer.masksToBounds = true 
Run Code Online (Sandbox Code Playgroud)

我必须masksToBounds将图层或clipsToBounds图像视图中的任何一个设置为true(基本上相同),以便剪切图像的边缘 - 但是一旦我这样做,焦点效果将不再起作用,因为它也会被剪裁.

我对按钮的问题或多或少有相同的问题,但由于焦点效果比图像视图(仅缩放和阴影)简单得多,我自己实现了它,但这不是图像视图的选项,所有应用的效果(移动,闪烁等......)

有没有更简单的方法?我错过了什么?我不能成为唯一想弄清楚它如何运作的人!?:)

Mic*_*ata 6

我已经找到了替代解决方案。人们可以做的就是实际绘制图像,用 Alpha 通道剪掉角落。聚焦后图像会正确缩放。这适用于图层。然后,要将 Alpha 通道添加到其他图层(例如用于发光效果的图层),我们需要进行设置;“masksFocusEffectToContents = true”。

我根据这个答案对其进行了扩展:

斯威夫特 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
    }
}
Run Code Online (Sandbox Code Playgroud)

然后应用圆角调用:

myImageView.adjustsImageWhenAncestorFocused = true
myImageView.clipToBounds = false

// masks all corners with a radius of 25 in myImageView
myImageView.roundedImage(corners: UIRectCorner.allCorners, radius: 25)
Run Code Online (Sandbox Code Playgroud)

显然,可以修改 roundedImage() 以添加参数来定义调用时的阴影。

缺点:

  • 边框的行为类似于cornerRadius(它们绘制在图像内部)。但我认为我让它在某个地方工作,然后进一步调查我丢失了更改
  • 我不太确定这是正确的方法。我非常有信心一定有一些方法可以用几行代码来完成它。在 tvOS 11 中,Apple 引入了圆形徽章(可动画和所有),如WWDC 2017上所示。我只是找不到他们的样本。

除此之外,tvOS 12(目前为测试版)引入了 Lockup。我设法以编程方式实现它们,如这个答案所示。


小智 3

https://forums.developer.apple.com/thread/20513

我们也面临着同样的问题。当你圆角时,你可以看到“光泽”仍然是矩形。

我在多伦多的技术讲座上向开发布道者展示了这个问题,他们说这是一个错误。据报道并开放rdar://23846376