2016-06-29 5 views
5

여기에 게시 된 솔루션 대부분을 시도한 후에도 스크롤 영역에서 키보드 위에 텍스트 필드를 표시하는 데 문제가 있습니다. 나는 그것이 나타난다 때 키보드 뒤에 1 개 필드가있는 가입 화면에서 일하고 있어요 Link 1 Link 2 Link 3Swift : ScrollRectToVisible이 작동하지 않습니다.

:

이들은

내가 유래 솔루션에서 다음 링크입니다. 포인트 프레임 및 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, 귀하의 의견에 감사드립니다. Apple에서 권장하는 방법을 사용하여 제 3 자 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) 
} 
관련 문제