动画UIView没有按预期工作

时间:2014-10-29 13:50:33

标签: ios objective-c uiview uiviewanimation

在我的应用程序中,我使用的是UIView,其中包含UITableViewButtonsLabels。它是使用Storyboard创建的。当用户单击导航栏按钮UIView时,会出现从顶部到特定高度的动画,如果再次单击它,则会隐藏带有动画的UIView(从该高度到顶部)。 与UIActionView相同。

如果UITableView中没有记录,它可以正常工作。但如果它有任何记录,在调用[self hideBasket]时,UIView会从视图底部显示到顶部(非隐藏)。

//隐藏篮子代码

-(void)hideBasket{
    /*Finished Hiding the Basket
     [self.view sendSubviewToBack:_shoppingCartView];
     [_shoppingCartView setHidden:YES];
     _isShoppingCartSeen = NO;*/

    CGRect basketFrame = _shoppingCartView.frame;
    basketFrame.origin.y = -basketFrame.size.height;

    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        _shoppingCartView.frame = basketFrame;
    } completion:^(BOOL finished) {
        // Finished Hiding the Basket
        //[self.view sendSubviewToBack:_shoppingCartView];
       // [_shoppingCartView setHidden:YES];
        _isShoppingCartSeen = NO;
}]; 

//显示购物篮代码

-(void)showBasket{

    /*[self.view bringSubviewToFront:_shoppingCartView];
    [_shoppingCartView setHidden:NO];
    _isShoppingCartSeen = YES;*/

    CGRect basketFrame = _shoppingCartView.frame;
    basketFrame.origin.y = 0;

    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        _shoppingCartView.frame = basketFrame;
    } completion:^(BOOL finished) {
        // Finished Showing the Basket
        [self.view bringSubviewToFront:_shoppingCartView];
        [_shoppingCartView setHidden:NO];
        _isShoppingCartSeen = YES;
    }];
}

我在这里做错了什么?

1 个答案:

答案 0 :(得分:5)

使用自动布局,您应该为约束设置动画,而不是更改对象框架。

我已经嘲笑了一个粗略的例子,说明从哪里开始使用约束,这应该可以解决你的问题

首先,您需要设置购物篮视图的约束

每个对象必须至少设置4个约束才能正确设置。

请参阅下面的屏幕截图,按下我选择的视图底部的约束图标来设置视图的宽度和高度,再加上左边距离约束。

然后,您需要将空间设置为超视图的顶部,请参阅第二个屏幕截图。

enter image description here

将约束设置为超级视图的顶部

enter image description here

设置好约束后,设置CTRL将顶部空间拖动到superview属性到您的头文件,如下面的屏幕截图所示。 (您需要在视图中设置约束以适应您的表格对象等),

enter image description here

现在已经设置好了,请用以下内容替换您的代码,它应该可以正常工作

-(void)hideBasket{

self.topVerticalSpaceConstraint.constant = -312;

[UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{

    [self.view layoutIfNeeded];

} completion:^(BOOL finished) {

}];

}

- (无效)showBasket {

self.topVerticalSpaceConstraint.constant = 0;

    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        [self.view layoutIfNeeded];

    } completion:^(BOOL finished) {

    }];

}

请注意我只是手动将常量设置为我所构建的虚拟视图的大小,但您当然会将其更改为视图的大小等。 < / p>

请记住,理想情况下,每个视图/对象都应设置约束,尤其是下拉视图中的UITableview。在UIView中设置表格的高度,宽度以及顶部和左侧空间限制就足够了。

如果您希望在第一次加载时隐藏视图,请使用viewDidload将约束设置为-valueOfHeightOfBasket

我希望这会有所帮助。

相关问题