animationUIView不按预期工作

在我的应用程序中,我使用的UIView其中包括UITableViewButtonsLabels 。 它使用Storyboard创build。 当用户点击一个导航栏button时, UIView将从顶部到一定高度的animation出现,如果他们再次点击它,它将隐藏UIViewanimation(从该高度到顶部)。 和UIActionView一样。

它工作正常,如果UITableView没有logging。 但如果它有任何logging,在调用[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; }]; } 

我在这里做错了什么?

使用自动布局,你应该animation你的约束,而不是改变对象的框架。

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

首先你需要设置篮子视图的约束条件

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

看下面的截图,按下我select的视图底部的约束图标来设置视图的宽度和高度,再加上左边的距离约束。

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

在这里输入图像说明

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

在这里输入图像说明

一旦你的约束已经build立,你设置CTRL拖动顶部空间到超级查看属性到你的头文件,如下面的截图。 (你需要在视图中设置你的约束以适应你的桌子objet等),

在这里输入图像说明

现在,这已经build立,请用下面的代码replace你的代码,它应该工作正常

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

}

请注意,我只是简单地将常量设置为我制作的虚拟视图的大小,尽pipe您当然可以将其更改为视图的大小等等。

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

如果你想让你的视图在第一次加载的时候被隐藏起来,你的viewDidload将约束设置为-valueOfHeightOfBasket

我希望这有帮助。