在我的应用程序中,我使用的是UIView
,其中包含UITableView
,Buttons
和Labels
。它是使用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;
}];
}
我在这里做错了什么?
答案 0 :(得分:5)
使用自动布局,您应该为约束设置动画,而不是更改对象框架。
我已经嘲笑了一个粗略的例子,说明从哪里开始使用约束,这应该可以解决你的问题
首先,您需要设置购物篮视图的约束
每个对象必须至少设置4个约束才能正确设置。
请参阅下面的屏幕截图,按下我选择的视图底部的约束图标来设置视图的宽度和高度,再加上左边距离约束。
然后,您需要将空间设置为超视图的顶部,请参阅第二个屏幕截图。
将约束设置为超级视图的顶部
设置好约束后,设置CTRL将顶部空间拖动到superview属性到您的头文件,如下面的屏幕截图所示。 (您需要在视图中设置约束以适应您的表格对象等),
现在已经设置好了,请用以下内容替换您的代码,它应该可以正常工作
-(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
我希望这会有所帮助。