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

时间:2015-12-14 23:05:57

标签: xcode uiimageview tvos apple-tv

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

Order

我必须将图层视图的imageView.layer.cornerRadius = 5 imageView.layer.masksToBounds = true 或图像视图的masksToBounds设置为true(基本相同),以便剪切图像的边缘 - 但是我这样做,焦点效果将不再起作用,因为它也会被剪裁。

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

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

2 个答案:

答案 0 :(得分:3)

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

  

我们也面临同样的问题。当您绕过角落时,您可以看到“闪耀”仍然具有矩形形状。

     

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

答案 1 :(得分:3)

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

我根据answer对此做了扩展:

Swift 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()以添加参数以在调用时定义阴影。

缺点:

  • 边界的行为类似于cornerRadius(它们在图像内部绘制)。 但是我想我可以在某个地方使用它,然后进一步调查 丢失了更改
  • 我不确定这是否是正确的方法。我非常有信心,必须有一些方法可以做到这一点。苹果在tvOS 11中引入了圆形徽章(可动画和全部徽章),如WWDC 2017所示。我只是找不到适合他们的样品。

否则,tvOS 12(现在为beta)引入了Lockup。我设法以编程方式实现了它们,如this answer所示。