Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从下到上设置UIView高度的动画_Ios_Animation_Uiview - Fatal编程技术网

Ios 从下到上设置UIView高度的动画

Ios 从下到上设置UIView高度的动画,ios,animation,uiview,Ios,Animation,Uiview,我正在做一个简单的UIView高度动画,以便显示 默认情况下,它似乎从上到下显示,我希望它从下到上显示 我将UIView定位到屏幕底部 我肯定我错过了一些简单的东西。。。。。有什么建议吗 谢谢相反,您可以尝试使用clipsToBounds=YES将其放置在视图中,然后从视图的底部到中间设置动画,如下所示: viewToAnimate.frame = CGRectMake(viewToAnimate.frame.origin.x,

我正在做一个简单的UIView高度动画,以便显示

默认情况下,它似乎从上到下显示,我希望它从下到上显示

我将UIView定位到屏幕底部

我肯定我错过了一些简单的东西。。。。。有什么建议吗


谢谢

相反,您可以尝试使用
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,它解决了视图中自动调整大小的任何问题。

就像一只带骨头的狗,我发现了这一点

我没有设置帧高度的动画,而是对视图应用了变换并设置了层的定位点

//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比例,视图的行为会很奇怪。。。。在动画结束时,我只是将其设置为隐藏

在备份的过程中,我只使用标识转换(重置它)

请注意,更改锚定点会改变视图的位置。有关设置锚点后使视图正常化的setAnchorPoint方法,请参见本文


根据要求,这是我正在使用的代码。。。我用的是一个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"];
}

我真的认为实现这一点最简单的方法是为视图的高度和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");
}];

我相信这会给人一种崩溃的感觉。我没有在代码中尝试过这一点,但我看不出有什么理由不可能做到这一点。

我使用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];
藏在下面

[self animateViewHeight:myView withAnimationType:kCATransitionFromBottom];
用于反向动画

[self animateViewHeight:myView withAnimationType:kCATransitionFromTop];


你有没有试着把它锚定在底部,然后把y坐标改变到你视图中正确的位置?是的,它锚定在底部。我想也许我需要翻转坐标系或者类似的东西。。。。因为在动画块中,我告诉帧从100到0,iOS坐标从上到下…更改y坐标只会将视图移出屏幕。。。我想让它崩溃,因为它不起作用。不管怎么说,它都在iPad上。想象一下,在屏幕中间,我想崩溃的正方形视图。我没有屏幕边缘的奢华。我想从上到下折叠长方体,然后从下到上再次显示它…我只需设置锚定在(0,1)处的CALayer高度的动画,并在锚定在底部时向顶部设置动画。我还没有尝试过UIView。听起来这很有效-但有点像黑客,我是一个纯粹主义者。。。必须有一个正确的方法来做这件事,现在它困扰着我,我必须找出它。。。谢谢你的想法,但我不认为这是一种黑客行为。此外,从你所描述的,它看起来像是从底部向上滑动,而不是增长,对吗?此外,我不认为有一种非黑客的方式可以从底部“生长”它,因为原点发生了变化。y将从顶部开始动画。我认为这是一种黑客行为,因为我相信有一种“正确”的方式来做。。。。我会在我的继承权中添加多余的UIView,以屏蔽其他视图的移动,从而执行我需要的操作。我应该能够将变换直接应用到我想要设置动画的图层上。ThanQ它通过一些自己的修改对我有很大帮助,不管怎样,这对于开始来说太多了……对不起,但是实际的“高度”值在哪里变化?回答得很好!在我找到您的ans之前,我尝试使用transitionWithView(…)方法,但实际上,正如我所看到的,它在选项参数中没有任何正常的转换。答案很好。但对我来说,KCATransionFrombottom是自上而下的。为什么会这样?
[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;
}