ios - 添加到 viewDidLayoutSubviews 时按钮渐变不起作用

标签 ios swift cagradientlayer

我正在使用下面的代码添加一个按钮渐变

extension UIView {
    func applyGradient(colors: [UIColor]) {
        self.applyGradient(colors: colors, locations: nil)
    }

    func applyGradient(colors: [UIColor], locations: [NSNumber]?) {
        let gradient = CAGradientLayer()
        gradient.frame = self.bounds
        gradient.colors = colors.map { $0.cgColor }
        gradient.locations = locations
        gradient.startPoint = CGPoint(x: 0, y: 0)
        gradient.endPoint = CGPoint(x: 1, y: 0)
        self.layer.insertSublayer(gradient, at: 0)
    }
}

viewDidLayoutSubviews() 中调用 initStyle() 无效。

func initStyle() {
    submitBtn.applyGradient(colors: [#colorLiteral(red: 0.1176470588, green: 0.3882352941, blue: 0.5254901961, alpha: 1), #colorLiteral(red: 0.2941176471, green: 0.9098039216, blue: 0.9529411765, alpha: 1)])
    submitBtn.layer.cornerRadius = 15.0
    submitBtn.layer.masksToBounds = true
}

我正在以编程方式创建所有 UI 元素。我已正确设置约束并且正在运行。

lazy var submitBtn: UIButton = {
    let btn = UIButton(type: .system)
    btn.translatesAutoresizingMaskIntoConstraints = false
    btn.setTitle("SUBMIT", for: .normal)
    return btn
}()

如何让它工作?


仅当我将 initStyle() 放在 viewDidAppear() 而不是 viewDidLayoutSubviews() 时才会显示渐变,这会造成延迟在显示按钮渐变。我想避免这种延迟。所以我将它添加到 viewDidLayoutSubviews 中,但是渐变没有出现。

最佳答案

我认为这里的问题是在调用梯度函数时 self.bounds 为 0。稍后尝试调用它,例如 viewWillAppear 或调用 view.layoutSubViews 来触发 iewDidLayoutSubviews()

关于ios - 添加到 viewDidLayoutSubviews 时按钮渐变不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56304384/

相关文章:

ios - 找不到图书馆

ios - UICollectionViewFlowLayout 中的动画更改

ios - 更改 UILabel 文本会导致可移动的 UIImageView 对象恢复到原始位置

ios - 重新调整布局大小后,如何将渐变层的大小放置在 UITextField 后面,匹配 UITextField 大小?

swift - 减慢 CAGradientLayer 动画速度

ios - Cocos2d 在我使用 UIScrollView 时停止

ios - 如何在 React Native 中获取 iOS 版本?

ios - 未从 VideoPreviewLayer 调用 attemptsBegan 方法

swift - 核心数据问题 Swift

ios - 在 UITableviewcell swift 中设置水平渐变