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];

Другие вопросы по тегам