如何设置UIPickerView的高度约束动画?

时间:2015-12-21 23:57:28

标签: ios uikit

我已经了解到在Cocoa Touch中设置约束动画的方法是设置它们然后将[self.view layoutIfNeeded]放在动画块中,如下所示:

self.someViewsHeightConstraint = 25.0;
[UIView animateWithDuration:0.5 animations:^{
    [self.view layoutIfNeeded];
}];

这很好,例如使用简单的UIView。但是,它不适用于UIPickerView。它只是在没有动画的情况下进入新的位置。

为什么会出现这种情况?有什么方法可以解决这个问题?

我想要的效果是Picker View应缩小到只显示所选项目,因为用户继续输入其他内容。我的一个想法就是制作一个快照视图并为其制作动画,但我也无法做到这一点。

2 个答案:

答案 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)

选择器视图,如果您为yPosition添加了约束To TopLayout,请将其删除并添加约束到底部布局。 这将解决问题。这是我的代码及其工作:

  

self.timePickerHeightConstraint.constant = pickerIsClosed? 216:   0;

[UIView animateWithDuration:0.5 animations:^{
      [self.view layoutSubviews];
}  completion:^(BOOL finished){  
}];
     

CONSTRAINT ON UIPICKERVIEW