UIView угловой радиус анимации
У меня есть некоторый класс для UIButton, как это:
@implementation UIRoundButton
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self.layer setCornerRadius:self.frame.size.width/2];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
[self.layer setCornerRadius:self.frame.size.width/2];
}
return self;
}
- (void) layoutIfNeeded
{
[super layoutIfNeeded];
[self.layer setCornerRadius:self.frame.size.width/2];
}
Так что создайте закругленную кнопку и измените радиус угла для автоматической разметки.
Но моя проблема в том, когда я хочу сделать анимацию следующим образом:
[UIView animateWithDuration:0.6 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
self.deleteButton.alpha = 1;
self.buttonHeight.constant = 40;
self.buttonWidth.constant = 40;
[self layoutIfNeeded];
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.6 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
self.deleteButton.alpha = 0;
self.buttonHeight.constant = 16;
self.buttonWidth.constant = 16;
[self layoutIfNeeded];
} completion:^(BOOL finished) {
}];
}];
Поэтому я изменяю ширину и высоту для этой кнопки. Проблема в том, что радиус угла не меняется должным образом. Зачем? Он должен вызвать метод layoutIfNeeded и изменить его.
Marko
РЕДАКТИРОВАТЬ:
Это означает, что до анимации кнопка имеет ширину и высоту 16. Анимация должна быть 40. Но углы всей анимации составляют 8 px. Затем в конце анимации я снова анимирую от значения ширины 40 до значения ширины 16, теперь радиус угла составляет 20 пикселей для всей анимации. Как это было бы вызвать layoutIfNeeded onelly в конце анимации
2 ответа
Думаю, что вам нужно позвонить [self setNeedsUpdateConstraints]
до layoutIfNeeded
, Я не уверен что self.frame.size.width/2
даст вам правильное значение в layoutIfNeeded
, может быть стоит попробовать с жестко закодированным значением, например, 20, чтобы увидеть, может ли это быть причиной.
Никто не видел, чтобы кто-нибудь использовал анимационный код в layoutIfNeeded
Также стоит попробовать перенести анимированные изменения в блок анимации.
Внесите изменения в ширину / высоту кнопки и затем вызовите. [self setNeedsDisplay];