2016-03-27 2 views
2

В моей пользовательской ячейке просмотра таблицы у меня есть 4 кнопки с анимацией (показано ниже). Проблема в том, что когда я использую UIButton, анимация не анимация, как я хотел. Но когда я использую UIView, он работает именно так, как я хочу.Разница анимации между UIView и UIButton

Код в точности совпадает с разницей в использовании другого типа UIView.

Эта анимация с использованием UIButton:

Animation with a button

Эта анимация с использованием UIView

Animation with a UIView

Чтобы сделать вещи немного более ясно, единственное Я заменил код:

// Test with Buttons 
let button1 = Button() // Subclass of UIButton 
let button2 = Button()  

// Test with UIViews 
let button1 = UIView() 
let button2 = UIView() 

Вопрос:
Может кто-нибудь сказать мне, почему UIButton ведет себя по-другому по сравнению с нормальным UIView?


Первоначально я думал, не отправляя код, я мог бы сделать вопрос легче читать оба теста используют точно такой же код (для «элемента», кроме (элемент является UIView или UIButton), и мысль возможно, проблема заключается в разнице между «элементами» я теперь понимаю, что это была моя ошибка

Мой код:..

class CustomView: UIView { 

    private var base: [NSLayoutConstraint] = [] 
    private var open: [NSLayoutConstraint] = [] 

    var buttons: [UIView] = [] 

    private var active = false 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     let button1 = CustomButton(frame: CGRectZero, color: UIColor.yellowColor().CGColor) 
     let button2 = CustomButton(frame: CGRectZero, color: UIColor.redColor().CGColor) 

    // let button1 = UIView(); button1.backgroundColor = UIColor.yellowColor() 
    // let button2 = UIView(); button2.backgroundColor = UIColor.redColor() 

     let views = ["button1": button1, "button2": button2] 

     buttons = [button1, button2] 

     buttons.enumerate().forEach { 
      $0.element.translatesAutoresizingMaskIntoConstraints = false 
      addSubview($0.element) 

      addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[button\($0.index + 1)]|", options: [], metrics: nil, views: views)) 

      base += [NSLayoutConstraint(item: $0.element, attribute: .Width , relatedBy: .Equal, toItem: buttons.first!, attribute: .Width , multiplier: 1, constant: 0)] 
     } 

     open += [NSLayoutConstraint(item: buttons.last!, attribute: .Width, relatedBy: .Equal, toItem: buttons.first!, attribute: .Width, multiplier: 0.33, constant: 0)]   
     addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[button1]-0.5-[button2]|", options: [], metrics: nil, views: views)) 
     addConstraints(base) 

     backgroundColor = .blackColor() 
     clipsToBounds = true 
    } 

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

    func changeState() { 
     removeConstraints(active ? open : base); addConstraints(active ? base : open) 

     active = !active 

     UIView.animateWithDuration(0.5, animations: { self.layoutIfNeeded() }) 
    } 
} 


После размещения кода и случайного изменения цвета фона кнопок, я заметил, что он вел себя соответственно. Это заставило меня понять, что я использовал CAShapeLayer в кнопках, которые вызывают поведение, наблюдаемое в первой анимации. Теперь я знаю, что исправить. Если это сообщение должно быть закрыто или удалено, сообщите мне об этом. Затем я удалю ответ. И спасибо тем, кто пытался помочь!

+0

Не возражаете ли вы рассказать мне, почему голос? Я не возражаю добавить код для анимации, но, видя, что он работает для 'UIView', я думаю, что он просто сделает сообщение излишне длинным. –

+0

Не могли бы вы добавить код анимации? Это, наверное, самое главное. – Sulthan

ответ

0

Не указывая больше деталей, единственное, что я могу сделать, - это угадать, что поведение, которое вы наблюдаете, сводится к тому, что кнопки менее эластичны, чем виды, поскольку они имеют «естественный» размер, определяемый их содержимым (заголовок и/или изображение), а автомакет действительно любит применять этот естественный размер (как вы можете видеть из предупреждений IB).

Если вам нужна дополнительная помощь, вы должны предоставить более подробную информацию. Вы фактически используете автоматическую компоновку? Какие ограничения? Что вы оживляете? и т. д.

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