Анимация свойства frame
может быть проблематичной, но она должна работать правильно, пока transform
является идентификатором (то есть вы не изменили его).Я только что протестировал следующий код, и он работал как положено:
[UIView animateWithDuration:.1f animations:^{
CGRect theFrame = myView.frame;
theFrame.size.height += 50.f;
myView.frame = theFrame;
}];
Опять же, это не будет работать, как ожидалось, если вы в любое время изменили свойство transform
.Для более пуленепробиваемой версии этой анимации вам нужно анимировать свойство bounds
, как вы пытались использовать Core Animation.Тем не менее, вам не нужно углубляться в Core Animation.
Здесь важно понять, как соотносятся свойства bounds
и center
.Все аффинные преобразования (переводить, масштабировать или вращать) нуждаются в контрольной точке, относительно которой необходимо выполнить преобразование.В случае UIView
это точка center
.CALayer
позволяет перемещать контрольную точку с помощью свойства anchorPoint
, но в этом случае нам не нужно беспокоиться об этом.
Причина, по которой изображение масштабируется в обоих направлениях, заключается в том, что операция масштабирования происходит вокруг center
.Тогда проще всего переместить center
y на половину дельты высоты.Например:
myView.contentMode = UIViewContentModeRedraw;
[UIView animateWithDuration:.4f animations:^{
CGRect theBounds = myView.bounds;
CGPoint theCenter = myView.center;
theBounds.size.height += 50.f;
theCenter.y += 25.f;
myView.bounds = theBounds;
myView.center = theCenter;
}];
Последнее соображение заключается в том, чтобы принудительно перерисовывать представление при изменении bounds
.По соображениям производительности представление не будет перерисовываться при изменении его bounds
.Однако он перерисовывается при изменении свойства frame
(еще одна особенность свойства frame
).Чтобы вызвать перерисовку изменения bounds
, вам нужно установить contentMode
, как я делал в первой строке предыдущего фрагмента.Возможно, вы захотите установить его обратно после завершения анимации, но это ваше дело.Это также причина, по которой ваша версия Core Animation меняет только местоположение, а не размер.Вам нужна эта строка в вашем коде где-то перед запуском анимации:
self.btnHead.layer.needsDisplayOnBoundsChange = YES;
Надеюсь, все это имеет смысл.Свойства frame
, bounds
и center
поначалу могут немного сбивать с толку.