2014-12-24 5 views
2

Я установил UIkeyboarddismissmode как .Interactive, и я не знаю, как изменить размер UITextView, чтобы клавиатура не покрывала контент. У меня также есть UIToolbar как inputaccessory.Клавиатура скрывает UITextView, когда появится

Вот мой код.

@IBOutlet weak var textView: UITextView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.addDoneButtonOnKeyboard() 

    self.textView.keyboardDismissMode = .Interactive 
} 

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(true) 

    // Add notification about keyboard 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardNotification:"), name:UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardNotification:"), name:UIKeyboardWillHideNotification, object: nil) 
    //  NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardFrameDidChange:"), name:UIKeyboardWillChangeFrameNotification, object: nil) 
} 

override func viewDidDisappear(animated: Bool) { 
    super.viewDidDisappear(true) 
    NSNotificationCenter.defaultCenter().removeObserver(UIKeyboardWillShowNotification) 
    NSNotificationCenter.defaultCenter().removeObserver(UIKeyboardWillHideNotification) 
} 


// The UIToolbar 

var toolbar = UIToolbar() 

func addDoneButtonOnKeyboard() 
{ 
    var doneToolbar: UIToolbar = UIToolbar(frame: CGRectMake(0, 0, 320, 44)) 
    doneToolbar.barStyle = UIBarStyle.Default 

    var flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) 
    var photo: UIBarButtonItem = UIBarButtonItem(title: "Add Photo", style: UIBarButtonItemStyle.Bordered, target: self, action: Selector("photoButtonAction")) 
    var done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: Selector("doneButtonAction")) 

    var items = NSMutableArray() 
    items.addObject(photo) 
    items.addObject(flexSpace) 
    items.addObject(done) 

    doneToolbar.items = items 
    doneToolbar.sizeToFit() 

    doneToolbar.tintColor = UIColor(red: 240/225, green: 42/225, blue: 20/225, alpha: 1) 
    doneToolbar.translucent = true 

    self.toolbar = doneToolbar 
    self.textView.inputAccessoryView = self.toolbar 
} 

func keyboardFrameDidChange(notification: NSNotification) { 
    if let userInfo = notification.userInfo { 
     var endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue() 
     var beginFrame = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() 

     let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber 
     let animationCurveRaw = animationCurveRawNSN?.unsignedLongValue ?? UIViewAnimationOptions.CurveEaseInOut.rawValue 
     let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw) 

     var animationDuration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0 

     var newFrame = self.textView.frame 
     var keyboardFrameEnd = self.view.convertRect(endFrame!, toView: nil) 
     var keyboardFrameBegin = self.view.convertRect(beginFrame!, toView: nil) 

     newFrame.origin.y -= (keyboardFrameBegin.origin.y - keyboardFrameEnd.origin.y) 
     self.textView.frame = newFrame 

     UIView.animateWithDuration(animationDuration, 
      delay: NSTimeInterval(0), 
      options: animationCurve, 
      animations: { self.view.layoutIfNeeded() }, 
      completion: nil) 
    } 

} 

Приведенный выше код только делает textView двигаться в странным образом, и я не знаю, как добиться эффекта, как приложение Message.

Update:

func keyboardFrameEnd(notification: NSNotification) { 
    if let userInfo = notification.userInfo { 
     var endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue() 

     // Change contentInset 
     self.textView.contentInset.bottom = endFrame!.height 
     self.textView.scrollIndicatorInsets.bottom = endFrame!.height 
    } 
} 

Я изменил код выше. Но иногда, когда я отпускаю клавиатуру наполовину, scrollView внезапно отскакивает на дно, что очень странно. Любое предложение?

+0

попробовать это: [ссылка] (http://stackoverflow.com/questions/11282449/move-uiview-up-when-the-keyboard-appears-in-ios). Я знаю, что это код Objective-C, но вы можете адаптировать его к Swift. – dehlen

+0

http://stackoverflow.com/questions/25693130/move-textfield-when-keyboard-appears-swift посмотреть на это – Sport

+0

Я пробовал методы выше, но они все жестко закодированы с помощью анимации. Мой режим keyboarddissmiss установлен как интерактивный, что означает, что вы перетаскиваете клавиатуру вручную, а не анимировали, как приложение iMessage. –

ответ

2

UITextView - это вид прокрутки. Вам не нужно изменять его размер при появлении клавиатуры: вы должны настроить его свойство contentInset, увеличивая размер .bottom на высоту клавиатуры.

+0

Спасибо. Он частично достиг желаемого эффекта. Однако полоса прокрутки справа не меняется, что вызывает путаницу. Любой способ решить это? –

+0

Решил проблему с scrollIndicatorInsets.bottom. Благодаря! –

+0

Идея: вид прокрутки выходит за клавиатуру, внизу просто добавляется вставка, чтобы вы могли прокручивать ее вниз и видеть нижнюю часть текста. – Gregzo

0

Он может применяться, есть ли у вас панель или нет. И это прекрасно восстановит представление, перемещенное клавиатурой в исходное положение.

// Set this up in storyboard first. 
// It's a vertical spacing constraint between your text view and bottom of superview. 
@IBOutlet weak var bottomSpacingConstraint: NSLayoutConstraint! 

override func viewDidLoad() { 
     super.viewDidLoad()    

     // Receive(Get) Notification 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardNotification:", name: UIKeyboardWillShowNotification, object: nil) 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardNotification:", name: UIKeyboardWillHideNotification, object: nil) 


     self.originalConstraint = self.keyboardHeightLayoutConstraint?.constant //for original coordinate. 
} 

func keyboardNotification(notification: NSNotification) { 
     let isShowing = notification.name == UIKeyboardWillShowNotification 

     var tabbarHeight: CGFloat = 0 
     if self.tabBarController? != nil { 
      tabbarHeight = self.tabBarController!.tabBar.frame.height 
     } 
     if let userInfo = notification.userInfo { 
      let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue() 
      let duration:NSTimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0 
      let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber 
      let animationCurveRaw = animationCurveRawNSN?.unsignedLongValue ?? UIViewAnimationOptions.CurveEaseInOut.rawValue 
      let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw) 
      self.keyboardHeightLayoutConstraint?.constant = isShowing ? (endFrame!.size.height - tabbarHeight) : self.originalConstraint! 
      UIView.animateWithDuration(duration, 
       delay: NSTimeInterval(0), 
       options: animationCurve, 
       animations: { self.view.layoutIfNeeded() }, 
       completion: nil) 
     } 
} 

Move textfield when keyboard appears swift

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