Apple और पिछले पोस्टों द्वारा प्रदान किए गए प्रलेखन को पढ़ने के बाद यहां मेरा संस्करण है। एक बात मैंने गौर की कि कीबोर्ड द्वारा कवर किए जाने पर टेक्स्ट व्यू को हैंडल नहीं किया गया था। दुर्भाग्य से, Apple का दस्तावेज़ीकरण काम नहीं करेगा, क्योंकि जो भी कारण से, कीबोर्ड को टेक्स्ट व्यू के बाद कहा जाता हैबिजिन एडिटिंग कहा जाता है। मैंने इसे एक केंद्रीय विधि कहकर संभाला जो यह जांचती है कि क्या कीबोर्ड प्रदर्शित होता है और यदि कोई टेक्स्ट व्यू या टेक्स्टफिल्ड संपादित किया जा रहा है। इस तरह, यह प्रक्रिया केवल तभी निकाल दी जाती है जब BOTH की स्थिति मौजूद हो।
TextViews के साथ एक और बिंदु यह है कि उनकी ऊंचाई ऐसी हो सकती है कि कीबोर्ड textView के निचले भाग को क्लिप करता है और यदि टॉप-लेफ्ट पॉइंट देखने में था तो यह समायोजित नहीं होगा। इसलिए, मैंने जो कोड लिखा है, वह वास्तव में किसी भी टेक्स्ट व्यू या टेक्स्टफिल्ड के स्क्रीन-रेफ़र्ड बॉटम-लेफ्ट पॉइंट को लेता है और देखता है कि क्या यह प्रस्तुत किए गए कीबोर्ड के स्क्रीन-संदर्भित निर्देशांक में आता है, जिसका अर्थ है कि कीबोर्ड इसके कुछ हिस्से को कवर करता है।
let aRect : CGRect = scrollView.convertRect(activeFieldRect!, toView: nil)
if (CGRectContainsPoint(keyboardRect!, CGPointMake(aRect.origin.x, aRect.maxY))) {
// scroll textView/textField into view
}
यदि आप एक नेविगेशन नियंत्रक का उपयोग कर रहे हैं, तो उपवर्ग झूठे को स्क्रॉल करने के लिए स्क्रॉल दृश्य स्वचालित समायोजन सेट करता है।
self.automaticallyAdjustsScrollViewInsets = false
यह प्रत्येक textView और textField के माध्यम से चलता है ताकि हैंडलिंग के लिए प्रतिनिधियों को सेट किया जा सके
for view in self.view.subviews {
if view is UITextView {
let tv = view as! UITextView
tv.delegate = self
} else if view is UITextField {
let tf = view as! UITextField
tf.delegate = self
}
}
परिणामों के लिए बस अपना आधार वर्ग यहां बनाए गए उपवर्ग पर सेट करें।
import UIKit
class ScrollingFormViewController: UIViewController, UITextViewDelegate, UITextFieldDelegate {
var activeFieldRect: CGRect?
var keyboardRect: CGRect?
var scrollView: UIScrollView!
override func viewDidLoad() {
self.automaticallyAdjustsScrollViewInsets = false
super.viewDidLoad()
// Do any additional setup after loading the view.
self.registerForKeyboardNotifications()
for view in self.view.subviews {
if view is UITextView {
let tv = view as! UITextView
tv.delegate = self
} else if view is UITextField {
let tf = view as! UITextField
tf.delegate = self
}
}
scrollView = UIScrollView(frame: self.view.frame)
scrollView.scrollEnabled = false
scrollView.showsVerticalScrollIndicator = false
scrollView.showsHorizontalScrollIndicator = false
scrollView.addSubview(self.view)
self.view = scrollView
}
override func viewDidLayoutSubviews() {
scrollView.sizeToFit()
scrollView.contentSize = scrollView.frame.size
super.viewDidLayoutSubviews()
}
deinit {
self.deregisterFromKeyboardNotifications()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func registerForKeyboardNotifications()
{
//Adding notifies on keyboard appearing
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ScrollingFormViewController.keyboardWasShown), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ScrollingFormViewController.keyboardWillBeHidden), name: UIKeyboardWillHideNotification, object: nil)
}
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)
{
let info : NSDictionary = notification.userInfo!
keyboardRect = (info[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue()
adjustForKeyboard()
}
func keyboardWillBeHidden(notification: NSNotification)
{
keyboardRect = nil
adjustForKeyboard()
}
func adjustForKeyboard() {
if keyboardRect != nil && activeFieldRect != nil {
let aRect : CGRect = scrollView.convertRect(activeFieldRect!, toView: nil)
if (CGRectContainsPoint(keyboardRect!, CGPointMake(aRect.origin.x, aRect.maxY)))
{
scrollView.scrollEnabled = true
let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardRect!.size.height, 0.0)
scrollView.contentInset = contentInsets
scrollView.scrollIndicatorInsets = contentInsets
scrollView.scrollRectToVisible(activeFieldRect!, animated: true)
}
} else {
let contentInsets : UIEdgeInsets = UIEdgeInsetsZero
scrollView.contentInset = contentInsets
scrollView.scrollIndicatorInsets = contentInsets
scrollView.scrollEnabled = false
}
}
func textViewDidBeginEditing(textView: UITextView) {
activeFieldRect = textView.frame
adjustForKeyboard()
}
func textViewDidEndEditing(textView: UITextView) {
activeFieldRect = nil
adjustForKeyboard()
}
func textFieldDidBeginEditing(textField: UITextField)
{
activeFieldRect = textField.frame
adjustForKeyboard()
}
func textFieldDidEndEditing(textField: UITextField)
{
activeFieldRect = nil
adjustForKeyboard()
}
}