2016-06-29 2 views
5

ここに掲載されたソリューションのほとんどを試した後、スクロールビューでキーボードの上に表示するようにテキストフィールドを移動するのにはまだ問題があります。 Link 1 Link 2 Link 3スウィフト:ScrollRectToVisibleが機能しない

私はそれが現れたときに、キーボードの後ろに1つのフィールドを持ってサインアップ画面に取り組んでいます:

これらは私がStackOverflowの溶液から続くリンクです。ポイントとフレームとsetContentOffsetと

class SignUpViewController: UIViewController, UITextFieldDelegate, UIScrollViewDelegate, UIPopoverPresentationControllerDelegate { 

@IBOutlet var firstNameTextField: UITextField! 
@IBOutlet var lastNameTextField: UITextField! 
@IBOutlet var phoneNumberTextField: UITextField! 
@IBOutlet var emailTextField: UITextField! 
@IBOutlet var submitButton: UIButton! 
@IBOutlet var professionButton: UIButton! 

var scrollView: UIScrollView? 
var activeTextField:UITextField? = UITextField() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let notificationCenter = NSNotificationCenter.defaultCenter() 

    notificationCenter.addObserver(self, selector: #selector(SignUpViewController.keyboardWasShown(_:)), name: UIKeyboardWillShowNotification, object: nil) 
    notificationCenter.addObserver(self, selector: #selector(SignUpViewController.keyboardWillBeHidden(_:)), name: UIKeyboardWillHideNotification, object: nil) 
    scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height)) 
    scrollView!.contentSize = CGSizeMake(self.view.frame.width, self.view.frame.height) 

    defaultSettings() 
} 

func defaultSettings() { 
    self.firstNameTextField.delegate = self 
    self.lastNameTextField.delegate = self 
    self.emailTextField.delegate = self 
    self.phoneNumberTextField.delegate = self 
} 

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 
    //self.scrollView!.scrollEnabled = true 
    var info : NSDictionary = notification.userInfo! 
    var keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size 
    var 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 (!CGRectContainsPoint(aRect, activeTextField!.frame.origin)) 
    { 
//   print(activeTextField?.frame) 
//   var scrollPoint = CGPointMake(0.0, activeTextField!.frame.origin.y - (keyboardSize!.height-15)) 
     self.scrollView!.scrollRectToVisible((activeTextField?.frame)!, animated: true) 
     //self.scrollView?.setContentOffset(scrollPoint, animated: true) 
    } 
} 


func keyboardWillBeHidden(notification: NSNotification) 
{ 
    //Once keyboard disappears, restore original positions 
    //var info : NSDictionary = notification.userInfo! 
    //var keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size 
    var contentInsets : UIEdgeInsets = UIEdgeInsetsZero 
    self.scrollView!.contentInset = contentInsets 
    self.scrollView!.scrollIndicatorInsets = contentInsets 
//  self.view.endEditing(true) 
//  self.scrollView!.scrollEnabled = false 

} 

func textFieldDidBeginEditing(textField: UITextField) 
{ 
    activeTextField = textField 
} 

func textFieldDidEndEditing(textField: UITextField) 
{ 
    activeTextField = nil 
} 

あなたが見ることができるように、私が試したでscrollRectToVisible:

は、ここに私のコードです。どちらもうまくいきませんでした。コードはemailTextFieldを隠しテキストフィールドとして選択します。

+1

使用TPKeyboardAvoiding https://github.com/michaeltyson/TPKeyboardAvoiding。その超簡単、それはすべての世話をするでしょう。 –

+0

@BharatModi、ご意見ありがとうございます。私はアップルが推奨する方法を使用して、サードパーティのAPIを使用したくなかった。 –

答えて

6

私もあなたと同じ問題で苦労していました。あなたが成功して解決策を見つけたのかどうかわかりませんが、最後にscrollRectToVisibleの代わりにsetContentOffset関数を使用しました。

スウィフト3.xの例:

if (!aRect.contains(activeTextView!.frame.origin)) { 
       self.scrollView.setContentOffset(CGPoint(x:0, y:self.activeTextView!.frame.origin.y), animated: true) 
} 
関連する問題