CALayer不能使用Autolayout进行调整

我创build了一个进度条,通过创build一个渐变图层在tableView中使用。 它完美的作品。

iphone 5: 在这里输入图像说明

为了在多个设备上使用应用程序,我创build了故事板中的UIView,标记了它并添加了约束。 但是,当我在iPhone 6上使用应用程序时,CALayer不会resize。

iPhone 6: 在这里输入图像说明

我觉得这非常愚蠢,但没关系。 我环顾四周,试图了解如何解决这个问题好几个月,但是我已经提出了一些问题。 是否有人知道如何使CALayers调整与UIView? 任何帮助将非常感激! 谢谢。

progressBar = cell.contentView.viewWithTag(3) as UIView! progressBar.layer.cornerRadius = 4 progressBar.layer.masksToBounds = true // create gradient layer let gradient : CAGradientLayer = CAGradientLayer() // create color array let arrayColors: [AnyObject] = [ UIColor (red: 255/255, green: 138/255, blue: 1/255, alpha: 1).CGColor, UIColor (red: 110/255, green: 110/255, blue: 118/255, alpha: 1).CGColor] // set gradient frame bounds to match progressBar bounds gradient.frame = progressBar.bounds // set gradient's color array gradient.colors = arrayColors //Set progress(progressBar) var percentageCompleted = 0.6 gradient.startPoint = CGPoint(x: 0.0, y: 0.5) gradient.locations = [percentageCompleted, percentageCompleted] gradient.endPoint = CGPoint(x: 1, y: 0.5) // replace base layer with gradient layer progressBar.layer.insertSublayer(gradient, atIndex: 0) 

UIView的默认图层的大小与其视图,但子图层不(如你所知)。 实现这一function的一种方法是创build一个自定义视图类,将您在问题中的代码移动到该视图上,并覆盖layoutSublayersOfLayer,您可以在其中将渐变图层设置为与视图大小相同。 因为这段代码现在在一个自定义类中,所以我还创build了一个属性percentageCompleted(而不是本地variables),并添加了一个willSet子句,以便在更改percentageCompleted属性时更新条的外观。

 class RDProgressView: UIView { private let gradient : CAGradientLayer = CAGradientLayer() var percentageCompleted: Double = 0.0 { willSet{ gradient.locations = [newValue, newValue] } } override func awakeFromNib() { self.layer.cornerRadius = 4 self.layer.masksToBounds = true // create color array let arrayColors: [AnyObject] = [ UIColor (red: 255/255, green: 138/255, blue: 1/255, alpha: 1).CGColor, UIColor (red: 110/255, green: 110/255, blue: 118/255, alpha: 1).CGColor] // set gradient's color array gradient.colors = arrayColors //Set progress(progressBar) gradient.startPoint = CGPoint(x: 0.0, y: 0.5) gradient.locations = [percentageCompleted, percentageCompleted] gradient.endPoint = CGPoint(x: 1, y: 0.5) self.layer.insertSublayer(gradient, atIndex: 0) } override func layoutSublayersOfLayer(layer: CALayer!) { super.layoutSublayersOfLayer(layer) gradient.frame = self.bounds } } 

在IB中,您将视图的类更改为RDProgressView(在我的示例中)以及cellForRowAtIndexPath中,只需要获取对该视图的引用,并设置其percentageCompleted属性。

 progressBar = cell.contentView.viewWithTag(3) as RDProgressView! progressBar.percentageCompleted = 0.2 

作为接受的答案的替代,您也可以将视图图层类更改为CAGradientLayer 。 视图层总是根据布局的变化来resize。 你可以通过inheritanceUIView来实现

 class GradientView: UIView { override class func layerClass() -> AnyClass { return CAGradientLayer.self } } 

然后设置颜色

 if let gradientLayer = gradientView.layer as? CAGradientLayer { gradientLayer.colors = arrayColors } 

与添加和维护子图层相比,代码更less,但可能不适合所有用例。