2015-01-16 4 views
2

Я хочу изменить размер текста при появлении клавиатуры. Код, который у меня есть, приведен ниже. У меня есть автоматическая компоновка, поэтому с помощью ограничения textView-> нижнего пространства от супервизора и ссылки на него через IBOutlet distanceFromBottom.Изменение размера UITextView при появлении клавиатуры

- (void)keyboardWillShow:(NSNotification *)notification 
{ 
    [UIView animateWithDuration:0.3 animations:^{ 
    NSDictionary* d = [notification userInfo]; 
    CGRect r = [d[UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
    r = [textView convertRect:r fromView:Nil]; 
    if(IS_IPHONE_6||IS_IPHONE_6P) 
     distanceFromBottom.constant = r.origin.y+78; 
    else if(IS_IPHONE_5) 
     distanceFromBottom.constant = r.origin.y+183; 
    }]; 
} 

Код выше отлично работает. Я не понимаю, почему мне нужно добавить +78 для iPhone6 ​​или 183 для iPhone5. Эти два значения я пришел с проб и ошибок. Если я их не добавлю, textView будет проходить под клавиатурой. Пожалуйста, помогите мне решить эту тайну.

ответ

9

В viewWillAppear методе, добавьте следующее:

- (void) viewWillAppear:(BOOL)paramAnimated{ 
    [super viewWillAppear:paramAnimated]; 

    [[NSNotificationCenter defaultCenter] 
     addObserver:self 
      selector:@selector(handleKeyboardDidShow:) 
       name:UIKeyboardDidShowNotification object:nil]; 

    [[NSNotificationCenter defaultCenter] 
     addObserver:self 
      selector:@selector(handleKeyboardWillHide:)  
       name:UIKeyboardWillHideNotification object:nil];  
} 

Затем реализовать два метода центра уведомлений, например:

- (void) handleKeyboardDidShow:(NSNotification *)paramNotification{ 

    NSValue *keyboardRectAsObject = 
     [[paramNotification userInfo] 
      objectForKey:UIKeyboardFrameEndUserInfoKey]; 

    CGRect keyboardRect = CGRectZero; 
    [keyboardRectAsObject getValue:&keyboardRect]; 

    yourTextView.contentInset = 
     UIEdgeInsetsMake(0.0f, 
         0.0f, 
         keyboardRect.size.height, 
         0.0f); 
} 

А другой, как:

- (void) handleKeyboardWillHide:(NSNotification *)paramNotification{ 

    yourTextView.contentInset = UIEdgeInsetsZero; 
} 

Он будет работать на всех устройствах;)

+1

Удивительный сэр. Работал как шарм. :) – user1191140

4

Swift/Модифицированная версия

Использование выше, я сделал некоторые корректировки, чтобы использовать NSLayoutConstraint «S изменения высоты constant свойства, когда клавиатура показывает и скрывает. Это также работает, если вы вращаете устройство.

1. Настройка TextView Ограничение

Затем контролирует сопротивление отдушину от вас ограничение высоты к классу.

enter image description here

2. Добавьте следующий

override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 

     NSNotificationCenter.defaultCenter().addObserver(self, selector:#selector(SkillDescriptionViewController.keyboardWillShowHandle(_:)), name: UIKeyboardDidShowNotification, object: nil) 

     NSNotificationCenter.defaultCenter().addObserver(self, selector:#selector(SkillDescriptionViewController.keyboardWillHideHandle), name: UIKeyboardWillHideNotification, object: nil) 

    } 


    func keyboardWillShowHandle(note:NSNotification) { 
     guard let keyboardRect = note.userInfo![UIKeyboardFrameEndUserInfoKey] as? NSValue else { return } 
     let kbFrame = keyboardRect.CGRectValue() 
     tvHeight.constant = -kbFrame.height 
     view.layoutIfNeeded() 
    } 

    func keyboardWillHideHandle() { 
     tvHeight.constant = 0 
     view.layoutIfNeeded() 
    } 
Смежные вопросы