为什么渐变不会覆盖视图的整个宽度
我正在尝试将渐变应用于主视图的顶部,左侧和右侧约束的视图,但由于某种原因,渐变不会覆盖应用于视图的整个宽度(请参阅黄色图片)。
class ViewController: UIViewController { @IBOutlet weak var myView: UIView! override func viewDidLoad() { super.viewDidLoad() let gradient = CAGradientLayer() gradient.colors = [UIColor.blue.cgColor, UIColor.white.cgColor] gradient.startPoint = CGPoint(x:00, y:00) gradient.endPoint = CGPoint(x:0, y:0.6) gradient.frame = myView.bounds myView.clipsToBounds = true myView.layer.insertSublayer(gradient, at: 0) } }
我究竟做错了什么?
问题可能是您在viewDidLoad()
中添加渐变图层。 直到viewDidLoad()
之后,视图才会设置为最终大小。
您的视图控制器可能会在您的XIB / Storyboard中设置,其屏幕大小与您运行它时不同。 (假设您已将其设置为iPhone SE大小,但您在6上运行它.6的屏幕稍微宽一点,因此在首次加载视图时,图层将设置为iPhone SE的宽度。然后将调整视图的大小,但不会调整图层的大小。)
您应该实现UIViewController方法viewDidLayoutSubviews()
,并在该方法中调整图层的框架:
override func viewDidLayoutSubviews() { gradientLayer.frame = self.view.bounds }
这样,如果视图resize(例如,由于自动旋转),渐变层将相应地自动调整。
编辑:
正如Sulthan所指出的,默认情况下,对图层框架的更改是动画的。 您应该将帧更改包装在CATransaction.begin
/ CATransaction.end
并禁用操作,如下所示:
override func viewDidLayoutSubviews() { CATransaction.begin() CATransaction.setDisableActions(true) gradientLayer.frame = self.view.bounds CATransaction.commit() }
您无需设置起点和终点,因为您的目标是让梯度跨越整个视图。 你已经用`设置了它
gradientLayer.frame = self.view.bounds
`
import UIKit class ViewController: UIViewController { @IBOutlet weak var myView: UIView! var gradientLayer: CAGradientLayer! override func viewDidLoad() { super.viewDidLoad() } override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) createGradientLayer() } func createGradientLayer() { gradientLayer = CAGradientLayer() gradientLayer.frame = self.view.bounds gradientLayer.colors = [UIColor.blueColor().CGColor, UIColor.whiteColor().CGColor] self.view.layer.addSublayer(gradientLayer) } }
- dispatch_sync(dispatch_get_global_queue(xxx),任务)同步或asynchronous
- :ImageIO:PNG无效的PNG文件:iDOT和IDAT之间的额外块
- iOS – 更改子类UIView子视图的框架(使用启用了自动布局的故事板)
- Xcode 4使用不同的配置设置构建静态库依赖项
- cordovaInfo.plist NSCameraUsageDescription密钥丢失
- 我怎么能animation的UIViewController推UINavigationBar背景更改?
- 在iOS中,如何读取源自WKWebView的NSURLRequest中的多部分表单数据?
- 如何在Sprite Kit中设置纹理以平铺
- Netsuite是否有一个RESTful API?