iOS17中UIImageView的allowsEdgeAntialiasing属性失效问题
iOS 17 中旋转 UIImageView 边缘抗锯齿失效问题
在App中使用transform属性旋转UIImageView后,发现iOS 17系统下这些视图的边缘出现严重锯齿。此前通过设置视图layer的allowsEdgeAntialiasing = true可以解决该问题,且在其他iOS版本中均正常生效。
视图设置代码
self.imageView.contentMode = .scaleAspectFill self.imageView.clipsToBounds = true self.imageView.backgroundColor = theme.BackgroundColor self.imageView.layer.borderWidth = theme.BorderSize self.imageView.alpha = theme.Alpha self.imageView.layer.borderColor = theme.BorderColor.cgColor self.imageView.layer.allowsEdgeAntialiasing = true
尝试在.info文件中全局设置抗锯齿,结果无变化;将allowsEdgeAntialiasing设为false也不会改变渲染结果。
系统版本效果对比
iOS 16 效果

iOS 17 效果

补充测试示例
以下是完整的测试代码,用于对比UIImageView和UIView在iOS 16/17下的抗锯齿表现:
class EdgeAntialiasingVC: UIViewController { override func viewDidLoad() { super.viewDidLoad() let g = view.safeAreaLayoutGuide let imageViewA = UIImageView() let imageViewB = UIImageView() let viewA = UIView() let viewB = UIView() let labelA = UILabel() let labelB = UILabel() [imageViewA, imageViewB, viewA, viewB].forEach { v in v.backgroundColor = .red v.translatesAutoresizingMaskIntoConstraints = false view.addSubview(v) v.layer.transform = CATransform3DMakeRotation(-.pi * 0.05, 0.0, 0.0, 1.0) NSLayoutConstraint.activate([ v.widthAnchor.constraint(equalToConstant: 20.0), v.heightAnchor.constraint(equalToConstant: 30.0), ]) } for (v, s) in zip([labelA, labelB], ["UIImageView", "UIView"]) { v.translatesAutoresizingMaskIntoConstraints = false view.addSubview(v) v.font = .systemFont(ofSize: 14.0, weight: .light) v.text = s } NSLayoutConstraint.activate([ labelA.topAnchor.constraint(equalTo: g.topAnchor, constant: 20.0), labelA.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 20.0), imageViewA.topAnchor.constraint(equalTo: labelA.bottomAnchor, constant: 4.0), imageViewB.topAnchor.constraint(equalTo: labelA.bottomAnchor, constant: 4.0), imageViewA.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 20.0), imageViewB.leadingAnchor.constraint(equalTo: imageViewA.trailingAnchor, constant: 20.0), labelB.topAnchor.constraint(equalTo: imageViewA.bottomAnchor, constant: 12.0), labelB.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 20.0), viewA.topAnchor.constraint(equalTo: labelB.bottomAnchor, constant: 4.0), viewB.topAnchor.constraint(equalTo: labelB.bottomAnchor, constant: 4.0), viewA.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 20.0), viewB.leadingAnchor.constraint(equalTo: viewA.trailingAnchor, constant: 20.0), ]) imageViewB.layer.allowsEdgeAntialiasing = true viewB.layer.allowsEdgeAntialiasing = true } }
测试示例包含两个UIImageView和两个UIView,右侧视图均设置了layer.allowsEdgeAntialiasing = true,效果对比如下:
iOS 16 测试效果

iOS 17 测试效果

内容的提问来源于stack exchange,提问作者displayname
相关产品推荐
相关产品推荐

