Как оживить при изменении размера UIView

Я видел некоторые материалы в Интернете, но до сих пор не могу добраться до места, где хочу. Мне нужно оживить мой взгляд вниз, сделав его более крупным.

Вот мой код. То, что происходит здесь, заключается в том, что вместо изменения размера обзора я просто немного изменил его местоположение. Если я изменю proprty вместо "bounds.size", чтобы быть "transform.scale.y", он немного лучше, только на этот раз он расширяет представление вверх и вниз, а не только вниз.

Еще одна вещь, о которой я не говорю: являются ли эти ключи только свойствами CALayer? где я могу найти список этих ключей?

Я бы очень хотел помочь здесь. Спасибо!

int x = self.btnHead.frame.origin.x;
int y = self.btnHead.frame.origin.y;
int height = self.btnHead.frame.size.height;
int width = self.btnHead.frame.size.width;


CABasicAnimation *resizeAnimation = [CABasicAnimation animationWithKeyPath:@"bounds.size"];
[resizeAnimation setToValue:[NSValue valueWithCGSize:CGSizeMake(width,height+50)]];
resizeAnimation.fillMode = kCAFillModeForwards;
resizeAnimation.removedOnCompletion = NO;

CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
animationGroup.animations = [NSArray arrayWithObjects:resizeAnimation,nil];
animationGroup.removedOnCompletion = NO;
animationGroup.fillMode = kCAFillModeForwards;
animationGroup.removedOnCompletion=NO;
animationGroup.duration = 0.1;

[self.btnHead.layer addAnimation:animationGroup forKey:@"animations"];

Изменить: размещение моего первого кода в соответствии с запросом - это просто изменит мой размер представления, но не будет анимировать, независимо от того, в какую продолжительность я вхожу.

    int x = self.btnHead.frame.origin.x;
    int y = self.btnHead.frame.origin.y;
    int height = self.btnHead.frame.size.height;
    int width = self.btnHead.frame.size.width;


    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:10];
    CGRect rect = CGRectMake(x,y,width ,height+BUTTON_HEIGH*2);

    self.btnHead.frame = rect;

    [UIView commitAnimations];

Ответы

Ответ 1

btnHead.clipsToBounds=YES

Решил проблему. Не уверен, почему.

Ответ 2

Анимация свойства 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. Все аффинные преобразования (перевод, масштабирование или поворот) нуждаются в контрольной точке, для которой необходимо выполнить преобразование. В случае a 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 могут сначала немного запутываться.

Ответ 3

Нельзя просто изменить кадр в блоке анимации UIView. Похоже, что CABasicAnimation не требуется в этом случае.

[UIView beginAnimations:@"resize_animation" context:NULL];
// set your duration. a long duration is better to debug
// 0.1 is really short to understand what is going wrong
[UIView setAnimationDuration:2]; 

btnHead.frame = newFrame;

[UIView commitAnimations];

Ответ 4

clipToBounds - это решение.

Объяснение: clipToBounds - свойство, которое указывает, нужно ли обрезать subviews или нет. Поэтому, если subview больше, чем его супервизор, он будет обрезан, если вы установите "superview.clipToBounds=YES". В случае этого сообщения супервизор WAS был изменен, но для пользователя не было видимой разницы, потому что субвью были нарисованы, даже если они были вне рамки.

Это немного сложно, потому что нет никакой видимой ссылки с анимацией, но вот почему это свойство имеет значение.