3

テキスト ビューを使用してテキストを編集できる単純なモーダル ビュー コントローラーを作成しようとしています。ただし、View Controller をモーダルに表示すると、下からスライドするのではなく、左下方向からスライドします。

これは奇妙な効果のビデオです: 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
4

1 に答える 1

5

[self.view layoutIfNeeded]呼び出しをアニメーションブロック内にラップすることで、ビューがアニメーション化されます。

viewDidLoadキーボードの変更を観察し始め、それらを検出すると調整をアニメーション化しますが、これは通常正しいことです。ただし、ビューが最初のレイアウトを実行する前に、キーボードを表示します。CGRectZeroこれにより、から適切なサイズまでのすべてのビューのアニメーションが作成されます。そして、これはあなたが見ている効果です。

したがって、基本的には、アニメーション呼び出しの前にビューにレイアウトする機会を与える必要があります。layoutIfNeededおそらくこれを行う最も簡単な方法は、または[self.textView becomeFirstResponder];のいずれかに移動することviewWillAppear:ですviewDidAppear:

*補足として、外観の呼び出しでスーパーを呼び出すことを忘れないでください。電話をかけなかったことに気づきました[super viewWillDisappear];

于 2013-03-09T05:49:53.780 に答える