2016-06-29 21 views
5

Sau khi thử hầu hết các giải pháp được đăng ở đây, tôi vẫn gặp sự cố khi di chuyển trường văn bản để hiển thị trên bàn phím trong chế độ xem cuộn.Swift: ScrollRectToVisible không hoạt động

Đây là những liên kết Tôi đi theo từ các giải pháp Stackoverflow: Link 1 Link 2 Link 3

Tôi đang làm việc trên một màn hình đăng ký có 1 sân phía sau bàn phím khi nó xuất hiện.

Dưới đây là mã của tôi:

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 
} 

Như bạn thấy đấy, tôi đã cố gắng scrollRectToVisible với khung và setContentOffset với Point. Cả hai đều không hoạt động. Trong khi mã chọn trên emailTextField ngay dưới dạng trường văn bản ẩn.

+1

Sử dụng TPKeyboardAvoiding https://github.com/michaeltyson/TPKeyboardAvoiding. Siêu dễ dàng của nó, không có nó sẽ chăm sóc của tất cả. –

+0

@BharatModi, Cảm ơn bạn đã bình luận của bạn. Tôi không muốn sử dụng API của bên thứ ba, đang tìm cách sử dụng phương pháp được Apple đề xuất. –

Trả lời

6

Tôi cũng đang đấu tranh với cùng một vấn đề như bạn đã làm, tôi không biết nếu bạn đã thành công và tìm thấy giải pháp, nhưng cuối cùng tôi đã sử dụng hàm setContentOffset thay vì scrollRectToVisible và nó hoạt động.

Swift dụ 3.x:

if (!aRect.contains(activeTextView!.frame.origin)) { 
       self.scrollView.setContentOffset(CGPoint(x:0, y:self.activeTextView!.frame.origin.y), animated: true) 
} 
Các vấn đề liên quan