渐变层在 Xib 文件中的纵向模式下不起作用

Posted

技术标签:

【中文标题】渐变层在 Xib 文件中的纵向模式下不起作用【英文标题】:Gradient Layer Is Not Working on Portrait Mode in Xib File 【发布时间】:2020-01-18 06:17:34 【问题描述】:

我想在Xib 文件中的UIView 上设置渐变层,但在纵向模式渐变层中,它不会填充所有UIView

渐变类:

extension UIView 
    @discardableResult
    func applyGradient(colours: [UIColor]) -> CAGradientLayer 
        return self.applyGradient(colours: colours, locations: nil)
    

    @discardableResult
    func applyGradient(colours: [UIColor], locations: [NSNumber]?) -> CAGradientLayer 
        let gradient: CAGradientLayer = CAGradientLayer()
        gradient.frame = self.bounds
        gradient.colors = colours.map  $0.cgColor 
        gradient.locations = locations
        self.layer.insertSublayer(gradient, at: 0)
        return gradient
    

Xib 文件类:

class TempView: UIView 

  override func awakeFromNib() 
        super.awakeFromNib()


    override func layoutSubviews() 
        super.layoutSubviews();
        self.viewMain.applyGradient(colours: [.black, .gray])
    

【问题讨论】:

您正在情节提要中使用此临时视图?什么是viewMain?描述你的代码。 tempView 是 Xib 文件的 Class,viewMain 是 Xib 文件中的 UIView 【参考方案1】:

试试这个:

    class TempView: UIView 

    override func awakeFromNib() 
        super.awakeFromNib()
     

    override func layoutSubviews() 
        super.layoutSubviews();
        self.viewMain.layoutIfNeeded()
        self.viewMain.applyGradient(colours: [.black, .gray])
    
    

【讨论】:

【参考方案2】:

我使用这个扩展来解决这个问题:

extension UIView 

    func addGradient(colors: [UIColor], locations: [NSNumber]) 
        addSubview(ViewWithGradient(addTo: self, colors: colors, locations: locations))
    


class ViewWithGradient: UIView 

    private var gradient = CAGradientLayer()

    init(addTo parentView: UIView, colors: [UIColor], locations: [NSNumber])

        super.init(frame: CGRect(x: 0, y: 0, width: 1, height: 2))
        restorationIdentifier = "__ViewWithGradient"

        for subView in parentView.subviews 
            if let subView = subView as? ViewWithGradient 
                if subView.restorationIdentifier == restorationIdentifier 
                    subView.removeFromSuperview()
                    break
                
            
        

        let cgColors = colors.map  (color) -> CGColor in
            return color.cgColor
        

        gradient.frame = parentView.frame
        gradient.colors = cgColors
        gradient.locations = locations
        backgroundColor = .clear

        parentView.addSubview(self)
        parentView.layer.insertSublayer(gradient, at: 0)
        parentView.backgroundColor = .clear
        autoresizingMask = [.flexibleWidth, .flexibleHeight]

        clipsToBounds = true
        parentView.layer.masksToBounds = true

    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    override func layoutSubviews() 
        super.layoutSubviews()

        if let parentView = superview 
            gradient.frame = parentView.bounds
        
    

    override func removeFromSuperview() 
        super.removeFromSuperview()
        gradient.removeFromSuperlayer()
    

【讨论】:

以上是关于渐变层在 Xib 文件中的纵向模式下不起作用的主要内容,如果未能解决你的问题,请参考以下文章

PackageInstaller 在 MIUI 优化模式下不起作用

.Net 3.5 中的 Configuration.Save() 在部署/发布模式下不起作用

UITableViewCell 背景渐变在第一次渲染时不起作用

日期时间的显示格式在 MVC Core 和引导程序 4 中的编辑模式下不起作用

IOS unregisterForRemoteNotifications 在飞行模式下不起作用

JHipster 应用程序在 prod 模式下不起作用