В моей пользовательской ячейке просмотра таблицы у меня есть 4 кнопки с анимацией (показано ниже). Проблема в том, что когда я использую UIButton
, анимация не анимация, как я хотел. Но когда я использую UIView
, он работает именно так, как я хочу.Разница анимации между UIView и UIButton
Код в точности совпадает с разницей в использовании другого типа UIView
.
Эта анимация с использованием UIButton
:
Эта анимация с использованием 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
в кнопках, которые вызывают поведение, наблюдаемое в первой анимации. Теперь я знаю, что исправить. Если это сообщение должно быть закрыто или удалено, сообщите мне об этом. Затем я удалю ответ. И спасибо тем, кто пытался помочь!
Не возражаете ли вы рассказать мне, почему голос? Я не возражаю добавить код для анимации, но, видя, что он работает для 'UIView', я думаю, что он просто сделает сообщение излишне длинным. –
Не могли бы вы добавить код анимации? Это, наверное, самое главное. – Sulthan