2015-12-21 2 views
1

я узнал, что путь к анимации ограничений в Cocoa Touch, чтобы просто установить их, а затем положить [self.view layoutIfNeeded] в анимации блока, например, так:Как я могу настроить ограничение высоты UIPickerView?

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

Это работает нормально, например, с помощью простого UIView , Однако он не работает с UIPickerView. Он просто вступает в новую позицию без оживления.

Любые идеи, почему это может быть так? Какими способами можно обойти это?

Эффект, который я собираюсь сделать, заключается в том, что Picker View должен уменьшаться, чтобы просто отображать выбранный элемент, так как пользователь продолжает вводить другие вещи. Одна из моих идей заключалась в том, чтобы сделать снимок и оживить это вместо этого, но я тоже не мог получить эту работу.

+0

вы нашли решение? –

+0

@martynmlostekk Я этого не сделал, но я не полностью изучил ответы ниже. – skagedal

ответ

0

Я нашел попытку оживить высоту или ограничение места размещения UIPickerView, чтобы быть проблематичным. Однако выполнение преобразований, по-видимому, хорошо работает, даже если у вас есть автоматические ограничения компоновки везде, в том числе в представлении, которое нужно преобразовать.

Вот пример того, что работает для меня. В этом случае я поместил вид подборщика в режим размытия эффектов, но вам даже не нужно помещать свой вид выбора в другой вид, чтобы оживить его.

В приведенном ниже коде, когда я вызываю шоу, он анимируется по вертикали. Когда я вызываю метод 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]; 
       }]; 

}

+0

Примечание: Эта техника работает для меня просто отлично, используя iOS 9.2.1. – idStar

0

выбора режима просмотра, если вы добавили ограничение Для TopLayout для yPosition удалить его и добавить ограничение на нижней макете вместо. Это решит проблему. вот мой код и его работа:

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

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

CONSTRAINT ON UIPICKERVIEW

Смежные вопросы