2016-06-19 2 views
1

Обучение Swift. У меня есть класс UIButton. Вот он:Пользовательский UIButton фон после изменения ориентации

class CustomBtn: UIButton { 
    var shadowLayer: CAShapeLayer! 
    var shadowAdded: Bool = false 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder)! 

    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 

    } 


    // Only override drawRect: if you perform custom drawing. 
    // An empty implementation adversely affects performance during animation. 
    override func drawRect(rect: CGRect) { 
     super.drawRect(rect) 

     shadowLayer     = CAShapeLayer() 
     shadowLayer.path   = UIBezierPath(roundedRect: bounds, cornerRadius: 5).CGPath 
     shadowLayer.fillColor  = UIColor(netHex: Colors.Red1.value).CGColor 
     shadowLayer.shadowColor  = UIColor.darkGrayColor().CGColor 
     shadowLayer.shadowPath  = shadowLayer.path 
     shadowLayer.shadowOffset = CGSize(width: 2.0, height: 2.0) 
     shadowLayer.shadowOpacity = 0.8 
     shadowLayer.shadowRadius = 2 

     layer.insertSublayer(shadowLayer, atIndex: 0) 
    } 
} 

И это мой выход:

enter image description here

Но когда я изменить ориентацию:

enter image description here

Что бы вы сделали, чтобы получить кнопку фона (красный цвет и тень) заполняют ширину в любой ориентации?

+0

Почему бы не использовать классы размеров и автомаршрут? и сделать его более отзывчивым, используя представления стека, которые следует делать. – Jeet

ответ

1

Для этого вам не нужно переопределять drawRect, поэтому лучше всего прислушаться к советам в комментарии над ним. Но проблема в том, что вы устанавливаете свой путь слоев на основе ограничений вашей кнопки, но эти ограничения меняются при повороте устройства, но вы не обновляете свой слой.

Также многие из эффектов, которые вы пытаетесь достичь, можно выполнить, установив свойства на самом слое вашей кнопки. Я хотел бы изменить свой класс на это:

class CustomBtn: UIButton { 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder)! 
     self.commonInit() 
    } 

    override init(frame:CGRect){ 
     super.init(frame: frame) 
     self.commonInit() 
    } 

    func commonInit(){ 

     self.layer.backgroundColor = UIColor(netHex: Colors.Red1.value).CGColor 
     self.layer.cornerRadius = 5 

     self.layer.shadowColor  = UIColor.darkGrayColor().CGColor 
     self.layer.shadowOffset = CGSize(width: 2.0, height: 2.0) 
     self.layer.shadowOpacity = 0.8 
     self.layer.shadowRadius = 2 
    } 
} 

Вы можете получить свой класс, чтобы быть немного более производительным, добавив к commonInit:

self.layer.shadowPath  = UIBezierPath(roundedRect: bounds, cornerRadius: 5).CGPath 

Но если вы делаете, что вы также хотите добавить:

override var bounds: CGRect{ 
     didSet{ 
      self.commonInit() 
     } 
    } 

Таким образом, в любое время смена границ вашей тени будет обновлена.

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