ios - 动画 UIView 没有按预期工作

标签 ios objective-c uiview uiviewanimation

在我的应用程序中,我使用的是 UIView其中包括 UITableView , ButtonsLabels在里面。它使用 Storyboard 创建.当用户单击导航栏按钮 UIView将出现从顶部到某个高度的动画,如果他们再次单击它,它会隐藏带有动画的 UIView(从那个高度到顶部)。
UIActionView 相同.

如果 UITableView 中没有记录,则可以正常工作.但是如果它有任何记录,同时调用 [self hideBasket] UIView 从 View 底部显示到顶部(未隐藏)。

//隐藏购物篮代码

-(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;
    }];
}

我在这里做错了什么?

最佳答案

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

我已经模拟了一个从哪里开始使用约束的粗略示例,这应该可以解决您的问题

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

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

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

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

enter image description here

将约束设置为 super View 的顶部

enter image description here

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

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) {

    }];

}

请注意,我只是在此处手动将常量设置为我制作的虚拟 View 的大小,尽管您当然可以将其更改为 View 的大小等。

请记住,理想情况下,您的每个 View /对象都应该设置它们的约束,尤其是下拉 View 中的 UITableview。在 UIView 中设置表格的高度、宽度和顶部和左侧空间约束就足够了。

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

我希望这有帮助。

关于ios - 动画 UIView 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26632100/

相关文章:

ios - 在 ipad 应用程序中使用 java 代码

iOS 10 与 iOS 11 安全区

iphone - 将当前位置从 iPhone 发布到 Rails

ios - 使用 1080p 复制 CVPixelBufferRef 时 memcpy 崩溃

ios - 复制CALayer

ios - 按下按钮时如何更改日期?

iphone - 未找到 Restkit.h 文件

ios - 如何在真实设备上将渐变应用到 iOS 10 中的 UIView

ios - 我的 UIScrollView(包含一些 UIControl)在 iOS 8 中不再滚动

objective-c - 如何将 PickerView 委托(delegate)从一个 Controller 更改为另一个 Controller ?