Высота анимации UIView снизу вверх - PullRequest
12 голосов
/ 19 ноября 2011

Я делаю простую анимацию высоты UIView, чтобы она раскрылась.

По умолчанию он отображается сверху вниз, и я хочу, чтобы он отображался снизу вверх.

У меня UIView привязан к нижней части экрана.

Я уверен, что это что-то простое, что мне не хватает ..... какие-нибудь советы?

Спасибо

Ответы [ 6 ]

10 голосов
/ 29 февраля 2012

Я действительно думаю, что самый простой способ сделать это - анимировать ОБА и высоту и свойства y вида. Если они происходят вдоль одной и той же кривой, это должно выглядеть абсолютно незаметно для пользователя. Поскольку вы анимируете высоту до 0, также анимируйте компонент y к исходному y + исходная высота.

UIView *view = ...;
float originalY = view.frame.origin.y;
float originalH = view.bounds.size.height;

[UIView animateWithDuration:1.2f delay:1.0f options:UIViewAnimationCurveEaseInOut animations:^{
    view.frame = CGRectMake(view.frame.origin.x, (originalY + originalH), view.bounds.size.width, 0);

}completion:^(BOOL finished) {
    NSLog(@"Animation is complete");
}];

Я полагаю, что это придаст вид рушащегося вида. Я не пробовал это в коде, но не вижу причин, почему это было бы невозможно.

9 голосов
/ 21 апреля 2014

скрыть под дном

[self animateViewHeight:myView withAnimationType:kCATransitionFromBottom];

для обратной анимации

[self animateViewHeight:myView withAnimationType:kCATransitionFromTop];

...

- (void)animateViewHeight:(UIView*)animateView withAnimationType:(NSString*)animType {  
    CATransition *animation = [CATransition animation];
    [animation setType:kCATransitionPush];
    [animation setSubtype:animType];

    [animation setDuration:0.5];
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
    [[animateView layer] addAnimation:animation forKey:kCATransition];
    animateView.hidden = !animateView.hidden;
}
5 голосов
/ 19 ноября 2011

Как собака с костью, я понял это ....

Вместо анимации высоты рамки, я применил преобразование к виду и установил опорную точку слоя.

//set the anchor point to the bottom of the view
[self setAnchorPoint:CGPointMake(0.5, 1.0) forView:hostView];
//Scale the height to close to zero
hostView.transform = CGAffineTransformMakeScale(1, 0.00001);

Если я укажу 0 в качестве шкалы y, вид будет вести себя странно ... в конце анимации я просто установил его скрытым.

На обратном пути я просто используюIdentity Transform (сбросьте его)

hostView.transform = CGAffineTransformIdentity;

Обратите внимание, что изменение точки привязки сместило положение моего обзора.См. Этот пост для метода setAnchorPoint, который нормализует представление после установки anchorPoint

Изменение anchorPoint моего CALayer перемещает представление

2 голосов
/ 22 ноября 2011

По запросу, это код, который я использую ... Я использую CAKeyFrameAnimation, которая может быть немного больше, чем вы ищете.С CABasicAnimation он, вероятно, будет работать так же, я просто показываю вам этот код, потому что он у меня уже написан.

-(id)initWithFrame:(CGRect)frame {
  self = [super initWithFrame:frame];
  if (self) {   
    springLayer = [[CALayer alloc] init];
    springLayer.backgroundColor = [UIColor redColor].CGColor;
    springLayer.anchorPoint = CGPointMake(0, 1);
    springLayer.frame = CGRectMake(125, 285, 100, 115);
    [springLayer setNeedsDisplay];
    [self.layer addSublayer:springLayer];
    [self test];
  }
  return self;
}

-(void)test {
    CAKeyframeAnimation *heightAnim = [[CAKeyframeAnimation alloc] init];
    heightAnim.duration = 3;
    heightAnim.removedOnCompletion = NO;
    heightAnim.fillMode = kCAFillModeForwards;

    heightAnim.beginTime = CACurrentMediaTime() + 0.25;

    NSMutableArray *v = [[NSMutableArray alloc] init];
    NSMutableArray *t = [[NSMutableArray alloc] init];

    float dest = 250;
    float difference = 135;


    while (difference > 1.0) {
        [v addObject:[NSNumber numberWithFloat:dest-difference]];
        [t addObject:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];

        difference *= 0.7;

        [v addObject:[NSNumber numberWithFloat:dest+difference]];
        [t addObject:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];

        difference *= 0.7;
    }

    heightAnim.values = v;
    heightAnim.timingFunctions = t;

    [springLayer addAnimation:heightAnim forKey:@"bounds.size.height"];
}
2 голосов
/ 19 ноября 2011

Вместо этого вы можете попробовать поместить его в вид с помощью clipsToBounds = YES, а затем анимировать его снизу до середины вида, например:

viewToAnimate.frame = CGRectMake(viewToAnimate.frame.origin.x,
                                 viewToAnimate.superview.frame.size.height,
                                 viewToAnimate.frame.size.width,
                                 viewToAnimate.frame.size.height);

[UIView animateWithDuration:0.5 animations:^{
     viewToAnimate.center = viewToAnimate.superview.center;
}];

Таким образом, вам не нужно устанавливать высоту равной 0, и это решает любые проблемы с автоматическим изменением размера в представлении.

0 голосов
/ 18 августа 2012

Один способ, которым я сделал это с AdWhirlView, скрыть его под экраном, а затем анимировать его;

AdWhirlView *adWhirlView = [AdWhirlView requestAdWhirlViewWithDelegate:self];
adWhirlView.delegate = self;
adWhirlView.frame = CGRectMake(0, 430+kAdWhirlViewHeight, kAdWhirlViewWidth, kAdWhirlViewHeight);
[self.parentViewController.view insertSubview:adWhirlView belowSubview:self.view];

[UIView beginAnimations:@"AdWhirlIn" context:nil];
[UIView setAnimationDuration:.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
adWhirlView.frame = CGRectMake(0, 430, kAdWhirlViewWidth, kAdWhirlViewHeight);
[UIView commitAnimations];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...