【问题标题】:Misplaced CAGradientLayer on iPhone 6siPhone 6s 上错位的 CAGradientLayer
【发布时间】:2016-08-31 17:42:25
【问题描述】:

我有几个带有彩色背景的UILabels,我向它们添加了CAGradientLayers,如下所示。

CAGradientLayer * gradientLayer = [CAGradientLayer layer];
gradientLayer.colors = [NSArray arrayWithObjects:
                        (id) [UIColor colorWithWhite:1 alpha:0.3].CGColor,
                        (id) [UIColor colorWithWhite:0.5 alpha:0.3].CGColor, nil];
gradientLayer.frame = label.bounds;
gradientLayer.cornerRadius = label.layer.cornerRadius;
[label.layer insertSublayer:gradientLayer atIndex:0];

在 iPhone 4 和 iPhone 5s 上,它看起来很完美,但在 iPhone 6s 上,CAGradientLayers 水平错位,如下图所示。

UIButtons 也会出现这个问题。

我正在运行 iOS 9.3。

【问题讨论】:

  • 该代码在您查看/查看控制器生命周期的哪个位置?
  • 如果标签和按钮的框架发生变化,那么渐变层需要随之变化。例如,如果标签使用自动布局布局并且视图旋转,则需要更新渐变的框架。您可以在视图控制器上的viewDidLayoutSubviews 中执行此操作,或者将带有渐变的标签/按钮子类化并更新layoutSubviews 中的渐变框架。
  • @beyowulf 代码在 viewDidLoad 方法中。
  • @keithbhunter 标签和按钮没有改变,这是一个仅限肖像的应用程序。

标签: ios objective-c iphone cagradientlayer


【解决方案1】:

您需要处理自动布局约束。这个 swift 代码代表你需要在viewDidLayoutSubviews 方法上做的事情:

class ViewController: UIViewController {

    @IBOutlet weak var button: UIButton!
    let gradientLayer = CAGradientLayer()

    override func viewDidLoad() {
        super.viewDidLoad()


        gradientLayer.colors = [UIColor(white: 1, alpha: 0.3).CGColor,
                                UIColor(white: 0.5, alpha: 0.3).CGColor]
        gradientLayer.frame = button.bounds
        gradientLayer.cornerRadius = button.layer.cornerRadius
        button.layer.insertSublayer(gradientLayer, atIndex: 0)
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        gradientLayer.frame = button.bounds
    }

}

【讨论】:

  • 我不需要在按钮上添加渐变层吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 2020-10-31
  • 2016-04-22
  • 1970-01-01
  • 2015-12-06
相关资源
最近更新 更多