2015-12-03 2 views
2

Я использую этот метод для применения градиентной границы к представлениям. Но когда представление находится в ячейке таблицы, частота кадров прокрутки в представлении таблицы заметно падает. Есть ли способ улучшить производительность? Я попытался установить непрозрачный, drawsAsynchronously и shouldRasterize, чтобы true, поскольку Apple предлагает, но ничего не изменилось.Улучшение производительности градиентной границы с использованием CAShapeLayer и CAGradientLayer

func addBorder(colors:[UIColor]? = nil,size:CGSize? = nil) { 



    _ = self.sublayers?.filter({$0.name == "GradientBorder"}).map({$0.removeFromSuperlayer()}) 
    let shapeFrame = CGRect(origin: CGPointZero, size: size ?? bounds.size) 
    let gradientLayer = CAGradientLayer() 
    gradientLayer.name = "GradientBorder" 

    gradientLayer.frame = shapeFrame 
    gradientLayer.startPoint = CGPointMake(0.0, 0.5) 
    gradientLayer.endPoint = CGPointMake(1.0, 0.5) 
    gradientLayer.colors = colors == nil ? [UIColor.blueColor().CGColor,UIColor.redColor().CGColor] : colors!.map({$0.CGColor}) 
    gradientLayer.contentsScale = UIScreen.mainScreen().scale 


    let shapeLayer = CAShapeLayer() 
    shapeLayer.lineWidth = 2 

    shapeLayer.path = UIBezierPath(roundedRect: shapeFrame, cornerRadius: self.cornerRadius).CGPath 
    shapeLayer.fillColor = nil 
    shapeLayer.strokeColor = UIColor.blackColor().CGColor 


    gradientLayer.shouldRasterize = true 
    gradientLayer.opaque = true 
    gradientLayer.drawsAsynchronously = true 
    shapeLayer.drawsAsynchronously = true 
    shapeLayer.opaque = true 

    gradientLayer.mask = shapeLayer 
    self.addSublayer(gradientLayer) 



} 
+0

Когда вы добавляете в эту систему границу? Можете ли вы показать эту часть кода? – TheEye

+0

@IBOutlet слабый var isOnlineViewContainer: UIView! { didSet { isOnlineViewContainer.layer.addBorder() } } –

+0

Ну, я имею в виду всю ситуацию - как часто называется функция addBorder? – TheEye

ответ

2

ОК, я нашел решение, и все было очень просто. Я просто добавил эти три строки.

override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 
    self.layer.shouldRasterize = true 
    self.opaque = true 
    self.layer.rasterizationScale = UIScreen.mainScreen().scale 
}