简体   繁体   中英

UITextView scrollview not moving when keyboard is shown

My app structure currently is a navigation controller that leads to viewcontrollers with scrollview embedded in them. The textfields, textview, buttons etc are on top of the scrollview. By using my current code, the scrollview moves the view when UITextFields are clicked, but not UITextViews. I have tried to adopt Apple's recommended method and tweaked it for UITextViews.

Also, in the function keyboardWillBeShown, the part that checks if active textfield/textview in hidden by the keyboard and scrolls, seems to not make any difference at all.

Where have I gone wrong? Thanks

class unwellBasic: UIViewController, UITextViewDelegate,
UIScrollViewDelegate, UITextFieldDelegate {

@IBOutlet var scrollView: UIScrollView!
weak var activeTextView : UITextView?
weak var activeTextField : UITextField?
@IBOutlet var main: UITextView!
@IBOutlet var initials: UITextField!
@IBOutlet var maleButton: UIButton!
@IBOutlet var femaleButton: UIButton!
@IBOutlet var age: UITextField!

@IBOutlet var test: UITextField!

func registerForKeyboardNotifications() {
    let notificationCenter = NSNotificationCenter.defaultCenter()
    notificationCenter.addObserver(self,
        selector: "keyboardWillBeShown:",
        name: UIKeyboardWillShowNotification,
        object: nil)
    notificationCenter.addObserver(self,
        selector: "keyboardWillBeHidden:",
        name: UIKeyboardWillHideNotification,
        object: nil)
}

@IBAction func back(sender: AnyObject) {
    self.navigationController?.popViewControllerAnimated(true)
}
@IBAction func next(sender: AnyObject) {
    self.performSegueWithIdentifier("bodySegue", sender: self)
}

func tapped() {
    initials.resignFirstResponder()
    main.resignFirstResponder()
    age.resignFirstResponder()
    test.resignFirstResponder()
    self.activeTextView = nil
}
// Called when the UIKeyboardDidShowNotification is sent.
func keyboardWillBeShown(sender: NSNotification) {
    let info: NSDictionary = sender.userInfo!
    let value: NSValue = info.valueForKey(UIKeyboardFrameEndUserInfoKey) as! NSValue
    let keyboardSize: CGSize = value.CGRectValue().size

    let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0)
    scrollView.contentInset = contentInsets
    scrollView.scrollIndicatorInsets = contentInsets

    // If active text field is hidden by keyboard, scroll it so it's visible
    if self.activeTextView != nil {
        var aRect: CGRect = self.view.frame
        aRect.size.height -= keyboardSize.height
        let activeTextViewRect: CGRect? = self.activeTextView!.frame
        let activeTextViewOrigin: CGPoint? = activeTextViewRect?.origin
        if (!CGRectContainsPoint(aRect, activeTextViewOrigin!)) {
        scrollView.scrollRectToVisible(activeTextViewRect!, animated:true)
        }

    }
    if self.activeTextField != nil {
        var aRect: CGRect = self.view.frame
        aRect.size.height -= keyboardSize.height
        let activeTextViewRect: CGRect? = self.activeTextField!.frame
        let activeTextViewOrigin: CGPoint? = activeTextViewRect?.origin
        if (!CGRectContainsPoint(aRect, activeTextViewOrigin!)) {
            scrollView.scrollRectToVisible(activeTextViewRect!, animated:true)
        }

    }

}

// Called when the UIKeyboardWillHideNotification is sent
func keyboardWillBeHidden(sender: NSNotification) {

    let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)
    scrollView.contentInset = contentInsets
    self.scrollView .setContentOffset(CGPointMake(0, 0), animated: true)
    self .viewDidLayoutSubviews()
    self.activeTextView = nil
}

func textViewDidBeginEditing(textView: UITextView) {

self.activeTextView = textView
scrollView.scrollEnabled = true
}

func textViewDidEndEditing(textView: UITextView) {

self.activeTextView = nil
    scrollView.scrollEnabled = false
    self.scrollView .setContentOffset(CGPointMake(0, 0), animated: true)
    self .viewDidLayoutSubviews()
}
func textFieldDidBeginEditing(textField: UITextField) {
    activeTextField = textField
    scrollView.scrollEnabled = true
}

func textFieldDidEndEditing(textField: UITextField) {
    activeTextField = nil
    scrollView.scrollEnabled = false
}


func textFieldShouldReturn(textField: UITextField) -> Bool // called when 'return' key pressed. return NO to ignore.
{
    textField.resignFirstResponder()
    return true;
}

override func viewDidLoad() {
    super.viewDidLoad()
    var tap = UITapGestureRecognizer (target: self, action: ("tapped"))
    self.view.addGestureRecognizer(tap)
    self.main.delegate = self
    self.initials.delegate = self
    self.age.delegate = self
 self.registerForKeyboardNotifications()
}

使用TPKeyboardAvoiding继承滚动视图,您不需要编写太多代码

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM