ios - CAGradientLayer 自转
问题描述
我使用 CAGradientLayer 来生成这个细线渐变。问题是自转不顺畅。随着 UIViewController 的旋转,我在 viewDidLayoutSubviews 中设置了包含该层的该视图的框架,并重置了该层的框架。当我自动旋转时,这条线的高度会增加,并且渐变会从上到下旋转一段时间。自动旋转这一层的正确方法是什么?
解决方案
我建议不要在viewDidLayoutSubviews
. 相反,我会让自动布局为你做这件事。
首先,定义
GradientView
将呈现CAGradientLayer
:class GradientView: UIView { // specify that the base layer should be gradient layer override class var layerClass: AnyClass { return CAGradientLayer.self } // it can be convenient to have computed property that returns layer of the `layerClass` private var gradientLayer: CAGradientLayer { return layer as! CAGradientLayer } // when we update our array of colors, update the gradient layer accordingly var colors: [UIColor] = [] { didSet { gradientLayer.colors = colors.map { $0.cgColor } } } // initializers override init(frame: CGRect = .zero) { super.init(frame: frame) configure() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) configure() } // configure the view for horizontal gradient private func configure() { colors = [.red, .yellow, .green, .blue] gradientLayer.startPoint = CGPoint(x: 0, y: 0.5) gradientLayer.endPoint = CGPoint(x: 1, y: 0.5) } }
通过指定
layerClass
此子视图的 ,您不必担心调整大小问题。根据需要调整视图大小,图层将自动调整大小。然后,只需为新视图添加约束,并让自动布局负责配置。例如
let gradientView = GradientView() gradientView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(gradientView) NSLayoutConstraint.activate([ gradientView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -10), gradientView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10), gradientView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10), gradientView.heightAnchor.constraint(equalToConstant: 3) ])
现在,显然,使用任何对你有用的约束,但希望这能说明这个想法。让自动布局配置frame
视图,并让因为layerClass
是CAGradientLayer
,它会自动为您更新。
推荐阅读
- wordpress - Wordpress 内存限制增加 .htaccess 文件的问题
- python - 我们可以更改 pandas 交叉表吗?
- java - 如何使用java仅从字符串列表中获取数字
- amazon-web-services - 使用 create_export_task 将日志从 cloudwatch 导出到 s3 不会丢失一些日志
- mongodb - Node.js Mongoose:值不代表设置的数据,但数据库已更改
- php - Wordpress - WooCommerce - 在桌面外显示“添加订单注释”表单
- batch-file - 如何将变量保存到批处理文件?
- java - spring:如何将角色应用于现有的 JWT 令牌
- python - 如何使这个不断变化的数据框更快?
- c# - .NET Core Web API - 无法插入记录调用 Oracle 存储过程