2017-01-30 4 views
0

У меня есть контроллер с Scrollview вид внутри и я установить его таким образом (с autolayout) в раскадровке:вид прокрутки и проблема клавиатуры Swift

Example

Как вы можете увидеть, добавить все объекты в последний вид (называемый «viewotto») внутри прокрутки. Моя проблема в том, что: Некоторые из этих объектов являются текстовыми полями, и я хочу, чтобы, когда я нажимаю на нее, и клавиатура показывает, что она может быть в текстовом поле, чтобы я мог видеть, что я пишу в ней. По этой причине я делаю это следующим образом:

NotificationCenter.default.addObserver(self, selector: #selector(userProfiloGiusto.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
     NotificationCenter.default.addObserver(self, selector: #selector(userProfiloGiusto.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) 

func keyboardWillShow(notification: NSNotification) { 

     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
      if self.view.frame.origin.y == 0{ 
       self.view.frame.origin.y -= keyboardSize.height 
      } 
     } 

    } 

    func keyboardWillHide(notification: NSNotification) { 
     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
      if self.view.frame.origin.y != 0{ 
       self.view.frame.origin.y += keyboardSize.height 
      } 
     } 
    } 

но это не работает. Что я делаю не так?

+0

не нужно указывать код https://github.com/hackiftekhar/IQKeyboardManager – karthikeyan

+0

@ karthikeyan является правильным. его легко реализовать. – vaibby

+0

спасибо. это потрясающе! –

ответ

0

Попробуйте ввести код. Сначала добавьте var activeField: UITextField?, чтобы проверить наличие текстового поля. Тогда в силу сделал вызов, нагрузка эту функцию:

override func viewDidLoad() { 
    super.viewDidLoad()self.registerForKeyboardNotifications() 

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard)) 
    view.addGestureRecognizer(tap) 
    tap.cancelsTouchesInView = false} 


func registerForKeyboardNotifications() 
{ 
    //Adding notifies on keyboard appearing 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ProfileReviewViewController.keyboardWasShown(_:)), name: UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ProfileReviewViewController.keyboardWillBeHidden(_:)), name: UIKeyboardWillHideNotification, object: nil) 
} 


func deregisterFromKeyboardNotifications() 
{ 
    //Removing notifies on keyboard appearing 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) 
} 
func keyboardWasShown(notification: NSNotification) 
{ 
    //Need to calculate keyboard exact size due to Apple suggestions 
    let info : NSDictionary = notification.userInfo! 
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size 
    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0) 


    self.scrollView.contentInset = contentInsets 
    self.scrollView.scrollIndicatorInsets = contentInsets 
    var aRect : CGRect = self.view.frame 
    aRect.size.height -= keyboardSize!.height 
    if activeField != nil 
    { 
     if (CGRectContainsPoint(aRect, activeField!.frame.origin)) 
     { 
      scrollView.scrollRectToVisible(activeField!.frame, animated: true) 
     } 
    } 
} 

func keyboardWillBeHidden(notification: NSNotification) 
{ 
    self.scrollView.contentInset = UIEdgeInsetsZero 
} 
//MARK : Textfield delegate methods 
func textFieldDidBeginEditing(textField: UITextField) { 
    activeField = textField 
} 

func textFieldShouldReturn(textField: UITextField) -> Bool { 

    self.view.endEditing(true) 
    activeField = nil 
    return false 
} 
func textFieldShouldEndEditing(textField: UITextField) -> Bool { //delegate method 

    activeField = nil 
    return true 
} 
func dismissKeyboard() { 
    //Causes the view (or one of its embedded text fields) to resign the first responder status. 

    activeField = nil 
    view.endEditing(true) 
} 
0

Скорее всего чтения вы используете, чтобы понять, если перекрывается не являются правильными.
Это обычная проблема, вы сталкиваетесь с ними своим основным видом, вместо этого вы должны получить фрейм текстового поля, сделать правильное преобразование, чтобы увидеть, перекрывает ли клавиатура его и соответствующим образом настраивает вложение содержимого прокрутки. Z
Это хорошо объяснено в документации Managing the keyboard.
Когда клавиатура отображается:

func keyboardWasShown(notification: NSNotification) 
{ 
    let info : NSDictionary = notification.userInfo! 
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size! 
    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0) 


    self.scrollView.contentInset = contentInsets 
    self.scrollView.scrollIndicatorInsets = contentInsets 

    // If active text field is hidden by keyboard, scroll it so it's visible 
    // Your app might not need or want this behavior. 
    var aRect : CGRect = self.view.frame 
    aRect.size.height -= keyboardSize.height 
    if let actField = activeField 
    { 
     if (CGRectContainsPoint(aRect, actField.frame.origin)) 
     { 
      scrollView.scrollRectToVisible(actField.frame, animated: true) 
     } 
    } 
} 

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

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