2014-09-29 23 views
11

Tôi có một scrollView mà tôi muốn cuộn lên khi bàn phím được hiển thị.Swift: cuộn chế độ xem lên khi bàn phím hiển thị

Tôi có một vụ tai nạn với lỗi này khi chương trình bàn phím:

2014/09/29 14: 48: 50,738 swrd [1563: 472.888] - [swrd.EditPhotoViewController keyboardWasShown]: chọn không được công nhận gửi đến dụ 0x14ed36640

đây là mã của tôi, có chuyện gì vậy?

func registerForKeyboardNotifications()-> Void { 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown", name: UIKeyboardDidShowNotification, object: nil) 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden", name: UIKeyboardWillHideNotification, object: nil) 


} 

func deregisterFromKeyboardNotifications() -> Void { 
    let center: NSNotificationCenter = NSNotificationCenter.defaultCenter() 
    center.removeObserver(self, name: UIKeyboardDidHideNotification, object: nil) 
    center.removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) 


} 


func keyboardWasShown (notification: NSNotification) { 

    let info : NSDictionary = notification.userInfo! 
    let keyboardSize = info.objectForKey(UIKeyboardFrameBeginUserInfoKey)?.frame 

    let insets: UIEdgeInsets = UIEdgeInsetsMake(self.scrollView.contentInset.top, 0, keyboardSize!.height, 0) 

    self.scrollView.contentInset = insets 
    self.scrollView.scrollIndicatorInsets = insets 

    self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, self.scrollView.contentOffset.y + keyboardSize!.height) 

} 

func keyboardWillBeHidden (notification: NSNotification) { 

    let info : NSDictionary = notification.userInfo! 
    let keyboardSize = info.objectForKey(UIKeyboardFrameBeginUserInfoKey)?.frame 

    let insets: UIEdgeInsets = UIEdgeInsetsMake(self.scrollView.contentInset.top, 0, keyboardSize!.height, 0) 

    self.scrollView.contentInset = insets 
    self.scrollView.scrollIndicatorInsets = insets 



} 


override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(true) 



    self.registerForKeyboardNotifications() 

} 

override func viewWillDisappear(animated: Bool) { 
    super.viewWillDisappear(true) 

    self.deregisterFromKeyboardNotifications() 

} 

Trả lời

10

Trong code của bạn, keyboardWasShownkeyboardWasHidden từng mất một cuộc tranh cãi, các NSNotification. Bạn cần phải chấm dứt các bộ chọn của mình trong addObserver bằng dấu hai chấm để nó được truyền đi. I.e., keyboardWasShownkeyboardWasShown: là các bộ chọn khác nhau.

NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardDidShowNotification, object: nil) 
10

Xem một giải pháp khép kín dưới đây:

private func startObservingKeyboardEvents() { 
    NSNotificationCenter.defaultCenter().addObserver(self, 
    selector:Selector("keyboardWillShow:"), 
    name:UIKeyboardWillShowNotification, 
    object:nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, 
    selector:Selector("keyboardWillHide:"), 
    name:UIKeyboardWillHideNotification, 
    object:nil) 
} 

private func stopObservingKeyboardEvents() { 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) 
} 

func keyboardWillShow(notification: NSNotification) { 
    if let userInfo = notification.userInfo { 
    if let keyboardSize: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue().size { 
     let contentInset = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0); 
    } 
    } 
} 

func keyboardWillHide(notification: NSNotification) { 
    let contentInset = UIEdgeInsetsZero; 
} 

Sử dụng các biến contentInset để điều chỉnh insets nội dung.

+1

cảm ơn bạn đã bao gồm tất cả mã, nội dung tuyệt vời, cảm ơn! –

2

Trong trường hợp của tôi, đã cần một số thay đổi trong các mã trên:

1 - Trước tiên, bạn cần đặt một scrollview theo quan điểm của bạn, và thiết lập các ràng buộc như thế này:

enter image description here

Điều quan trọng là scrollView của bạn là vắt tay hơn xem.

2 - Đặt TextField của bạn và các thành phần khác mà bạn cần.

3 - Liên kết scrollview đến ViewController với @IBOutlet

4 - Thêm các đại biểu để scrollview:

class ViewController: UIViewController, UITextFieldDelegate,  UIScrollViewDelegate { 
... 

5 - Thêm của Observer:

override func viewWillAppear(animated: Bool) { 
    self.startKeyboardObserver() 
} 

override func viewWillDisappear(animated: Bool) { 
    self.stopKeyboardObserver() 
} 


private func startKeyboardObserver(){ 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil) //WillShow and not Did ;) The View will run animated and smooth 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil) 
} 

private func stopKeyboardObserver() { 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) 
} 

6 - Thêm Các để cuộn, tính toán KeyboardSize.

func keyboardWillShow(notification: NSNotification) { 
     if let userInfo = notification.userInfo { 
     if let keyboardSize: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue().size { 
      let contentInset = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0); 

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

     self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, 0 + keyboardSize.height) //set zero instead self.scrollView.contentOffset.y 

     } 
    } 
} 

func keyboardWillHide(notification: NSNotification) { 
    if let userInfo = notification.userInfo { 
     if let keyboardSize: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue().size { 
      let contentInset = UIEdgeInsetsZero; 

     self.scrollView.contentInset = contentInset 
     self.scrollView.scrollIndicatorInsets = contentInset 
     self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, self.scrollView.contentOffset.y) 
     } 
    } 
} 
+0

Có hiệu ứng nhấp nháy khi bàn phím xuất hiện. Chế độ xem đầu tiên di chuyển lên và sau đó nó sẽ đến trường khai thác –

Các vấn đề liên quan