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

问题描述 投票:0回答:3

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

imageView.layer.cornerRadius = 5
imageView.layer.masksToBounds = true 

我必须将图层的

masksToBounds
或图像视图的
clipsToBounds
设置为 true (基本相同),以便剪切图像的边缘 - 但一旦我这样做,焦点效果将不再起作用,因为它也会被剪切。

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

有更简单的方法吗?我错过了什么?我不能是唯一一个试图弄清楚这是如何工作的人!? :)

xcode uiimageview tvos apple-tv
3个回答
6
投票

我找到了替代解决方案。人们可以做的就是实际绘制图像,用 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() 以添加参数来在调用时定义阴影。

缺点:

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

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


3
投票

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

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

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


1
投票

20222023 ...

导入

TVUIKit
以使用
TVPosterView

幸运的是

TVPosterView
现在效果很好。这可能是您的最佳解决方案。只需在 TVPosterView` 上设置
.image

您也可以仅使用

UICardView
来达到效果。 (在这种情况下,只需将 UIImageView 放入卡片视图中即可。不要忘记在 image view 上实际关闭“调整祖先焦点”和“启用用户交互”,否则当卡片视图扩大!)

  • 使用

    TVPosterView
    ,您在玩弄遥控器时可以获得“两种”3D 效果。

  • UICardView
    不同,在玩弄遥控器时您只能获得“一种”3D效果。尝试一下,看看有什么不同。

但是...

  • 使用

    TVPosterView
    ,您确实会遇到奇怪的问题(与仅图像视图一样),图像根本无法正确缩放,它会忽略缩放模式。

  • 使用

    UICardView
    图像将正常缩放(无论您如何指示),就像在 iOS 上一样

© www.soinside.com 2019 - 2024. All rights reserved.