2013-03-09 4 views
1

Я пытаюсь создать простой контроллер модального представления, который позволяет редактировать текст, используя текстовое представление. Однако, когда я представляю контроллер вида по модулю, он перемещается из левого нижнего положения вместо того, чтобы просто скользить снизу.Present ViewController modally показывает странную анимацию

Вот видео странный эффект: http://youtu.be/9M_MHA5mt1M

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

#import "TextPicker.h" 

@interface TextPicker() 

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *keyboardHeight; 

@end 

@implementation TextPicker 

- (id)initWithText:(NSString *)text 
{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; 
    self = [storyboard instantiateViewControllerWithIdentifier:@"textPicker"]; 
    if (self) { 
     self.text = text; 

    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self observeKeyboard]; 

    //self.textView.text = self.text; 
    [self.textView becomeFirstResponder]; 
} 


- (void) viewWillDisappear:(BOOL)animated { 
    [self.textView resignFirstResponder]; 
} 

- (IBAction)savePressed:(id)sender { 
    [self dismissViewControllerAnimated:YES completion:nil];  
} 

- (IBAction)cancelPressed:(id)sender { 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
} 

- (void) dealloc { 
    [self stopObervingKeyboard]; 
} 

- (void)observeKeyboard { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillChangeFrameNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 
} 

- (void)stopObervingKeyboard { 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillChangeFrameNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; 
} 

- (void)keyboardWillShow:(NSNotification *)notification { 
    NSDictionary *info = [notification userInfo]; 

    NSValue *kbFrame = [info objectForKey:UIKeyboardFrameEndUserInfoKey]; 
    CGRect keyboardFrame = [kbFrame CGRectValue]; 
    self.keyboardHeight.constant = -keyboardFrame.size.height; 

    NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 
    [UIView animateWithDuration:animationDuration animations:^{ 
     [self.view layoutIfNeeded]; 
    }]; 
} 

- (void)keyboardWillHide:(NSNotification *)notification { 
    NSDictionary *info = [notification userInfo]; 
    NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 

    self.keyboardHeight.constant = 0; 
    [UIView animateWithDuration:animationDuration animations:^{ 
     [self.view layoutIfNeeded]; 
    }]; 
} 

- (IBAction)dismissKeyboard:(id)sender { 
    [self.textView resignFirstResponder]; 
} 


@end 
+0

Убедитесь, что в приложении нет пропущенных вызовов «commitAnimation» (что-то, что будет следовать «beginAnimation»). – Till

+1

Почему вы используете свою собственную анимацию? Вы пытаетесь выглядеть иначе, чем обычный модальный переход? – rdelmar

ответ

1

Ваше мнение анимировать, как вы попросили его обертывания [self.view layoutIfNeeded] вызова внутри анимационного блока.

В viewDidLoad вы начинаете наблюдать за изменениями клавиатуры, и когда вы их обнаруживаете, вы настраиваете настройки, это обычно правильно. Но затем, прежде чем представление сделает свой первый макет, вы покажете клавиатуру; это приводит к анимации для всех видов от CGRectZero до их правильных размеров. И это тот эффект, который вы видите.

Таким образом, в основном вам нужно дать представление о макете до ваш анимированный звонок layoutIfNeeded. Вероятно, самый простой способ сделать это - просто переместить [self.textView becomeFirstResponder]; в viewWillAppear: или viewDidAppear:.

* Как примечание стороны, не забудьте вызвать супер по внешнему виду звонки. Я заметил, что вы не звонили [super viewWillDisappear];.

+0

было точно, спасибо! – aloo

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