在我的应用程序中,我使用的是 UIView
其中包括 UITableView
, Buttons
和 Labels
在里面。它使用 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 的顶部,请参见第二个屏幕截图。
将约束设置为 super View 的顶部
设置约束后,设置 CTRL 将顶部空间拖动到 superview 属性到您的头文件,如下面的屏幕截图。
(您需要在 View 中设置约束以适应您的表对象等),
现在已经设置好了,请用以下代码替换您的代码,它应该可以正常工作
-(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/