2014-10-25 2 views
0

Вот GIF, иллюстрирующий проблему:Как я могу держать маску UITextView синхронно с рамой

Вот код, который я в настоящее время, это просто округляет две верхние углы UITextView.

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.view.backgroundColor = UIColor.whiteColor() 

     let textView = UITextView(frame: CGRectMake(20, 20, self.view.frame.width - 40, 60)) 
textView.bounces = false 
     textView.backgroundColor = UIColor.grayColor() 

     let maskPath = UIBezierPath(
      roundedRect: textView.bounds, 
      byRoundingCorners: (UIRectCorner.TopLeft | UIRectCorner.TopRight), 
      cornerRadii: CGSizeMake(8, 8) 
     ) 
     let maskLayer = CAShapeLayer() 
     maskLayer.frame = textView.bounds 
     maskLayer.path = maskPath.CGPath 
     textView.layer.mask = maskLayer 

     self.view.addSubview(textView) 
    } 

} 

Я попытался подклассов UITextView и первостепенную layoutSubviews так:

class TextView: UITextView { 
    var maskLayer: CAShapeLayer! 

    override func layoutSubviews() { 
     maskLayer.frame = bounds 
    } 
} 

Но заканчивается странным анимации:

Мой вопрос: Как сохранить два в синхронизации?

ответ

4

Ваше решение в layoutSubviews является правильным. Проблема в том, что изменения в уровнях Core Animation неявно анимируются. Вы можете предотвратить это, обернув изменение кадра в CATransaction, и установив свойство этой транзакции, отключающую основные действия Animation:

override func layoutSubviews() { 
    CATransaction.begin() 
    CATransaction.setDisableActions(true) 
    maskLayer.frame = bounds 
    CATransaction.commit() 
} 
+0

Чемпион! Спасибо Стюарту. – twe4ked

Смежные вопросы