我已经了解到在Cocoa Touch中设置约束动画的方法是设置它们然后将[self.view layoutIfNeeded]
放在动画块中,如下所示:
self.someViewsHeightConstraint = 25.0;
[UIView animateWithDuration:0.5 animations:^{
[self.view layoutIfNeeded];
}];
这很好,例如使用简单的UIView
。但是,它不适用于UIPickerView
。它只是在没有动画的情况下进入新的位置。
为什么会出现这种情况?有什么方法可以解决这个问题?
我想要的效果是Picker View应缩小到只显示所选项目,因为用户继续输入其他内容。我的一个想法就是制作一个快照视图并为其制作动画,但我也无法做到这一点。
答案 0 :(得分:0)
我发现尝试设置UIPickerView
的高度或放置约束的动画是有问题的。但是,进行转换似乎效果很好 - 即使您在任何地方都有自动布局约束,包括在要转换的视图中。
这是一个对我有用的例子。在这种情况下,我将选择器视图放在模糊效果视图中 - 但您甚至不需要将选择器视图放在另一个视图中来为其设置动画。
在下面的代码中,当我调用show时,它会垂直动画。当我调用hide方法时,它会向下动画。
- (void)showPickerViewAnimated:(BOOL)animated;
{
__weak MyViewController *weakSelf = self;
[UIView animateWithDuration:(animated ? kPickerView_AppearanceAnimationDuration : 0.0)
delay:(animated ? kPickerView_AppearanceAnimationDelay : 0.0)
options:(UIViewAnimationOptionCurveEaseInOut)
animations:^{
weakSelf.pickerViewContainerView.transform = CGAffineTransformMakeTranslation(0,0);
}
completion:^(BOOL finished) {
[weakSelf.view layoutIfNeeded];
}];
}
- (void)hidePickerViewAnimated:(BOOL)animated;
{
__weak MyViewController *weakSelf = self;
[UIView animateWithDuration:(animated ? kPickerView_DisappearanceAnimationDuration : 0.0)
delay:(animated ? kPickerView_DisappearanceAnimationDelay : 0.0)
options:(UIViewAnimationOptionCurveEaseInOut)
animations:^{
weakSelf.pickerViewContainerView.transform = CGAffineTransformMakeTranslation(0, kPickerView_Height);
}
completion:^(BOOL finished) {
[weakSelf.view layoutIfNeeded];
}];
}
答案 1 :(得分:0)