动画UIView无法按预期工作

vin*_*thp 1 objective-c uiview uiviewanimation ios

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

如果没有记录,它可以正常工作UITableView.但如果它有任何记录,则调用[self hideBasket]UIView时会从视图底部显示到顶部(Not Hidden).

//隐藏篮子代码

-(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;
}]; 
Run Code Online (Sandbox Code Playgroud)

//显示篮子代码

-(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;
    }];
}
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?

Jim*_*ney 5

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

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

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

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

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

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

在此输入图像描述

将约束设置为superview的顶部

在此输入图像描述

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

在此输入图像描述

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

-(void)hideBasket{

self.topVerticalSpaceConstraint.constant = -312;

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

    [self.view layoutIfNeeded];

} completion:^(BOOL finished) {

}];
Run Code Online (Sandbox Code Playgroud)

}

- (无效)showBasket {

self.topVerticalSpaceConstraint.constant = 0;

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

    } completion:^(BOOL finished) {

    }];
Run Code Online (Sandbox Code Playgroud)

}

请注意我只是手动将常量设置为我组成的虚拟视图的大小,但您当然会将其更改为视图的大小等.

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

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

我希望这有帮助.