2015-01-25 6 views
5

की ऊंचाई बढ़ाएं, मैं लगभग पूरी तरह से कुंजीपटल के ऊपर एक UITextView को स्थानांतरित कर रहा हूं, पाठ की मात्रा के आधार पर इसकी ऊंचाई बढ़ा रहा/घटा रहा हूं और फिर इसे अपनी मूल स्थिति में वापस कर रहा हूं। हालांकि, मुझे UITextView के साथ माता-पिता UIView को बढ़ने में परेशानी हो रही है।आईओएस स्विफ्ट - गतिशील रूप से UITextView और पैरेंट UIView

enter image description hereenter image description hereenter image description here

अगर मैं अपने अद्यतन आकार करने के लिए माता-पिता UIView अद्यतन करने के लिए विधि updateParentView() की अंतिम पंक्ति uncomment, कुछ भी आकार बदलता है, UITextView भी शामिल है।

class ViewController: UIViewController, UITextViewDelegate { 

    var kPreferredTextViewToKeyboardOffset: CGFloat = 0.0 
    var keyboardFrame: CGRect = CGRect.nullRect 
    var keyboardIsShowing: Bool = false 

    @IBOutlet weak var commentView: UIView! 
    @IBOutlet weak var textView: UITextView! 
    @IBOutlet weak var sendButton: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 

     NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil) 

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

     // Make it look like UITextField 
     self.textView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0) 
     self.textView.sizeToFit() 
     let lightestGrayColor: UIColor = UIColor(red: 224.0/255.0, green: 224.0/255.0, blue:224.0/255.0, alpha: 1.0) 
     self.textView.layer.borderColor = lightestGrayColor.CGColor 
     self.textView.layer.borderWidth = 0.6 
     self.textView.layer.cornerRadius = 6.0 
     self.textView.clipsToBounds = true 
     self.textView.layer.masksToBounds = true 
    } 

    override func viewWillDisappear(animated: Bool) { 
     super.viewWillDisappear(animated) 
     NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

    func keyboardWillShow(notification: NSNotification) 
    { 
     self.keyboardIsShowing = true 

     if let info = notification.userInfo { 
      self.keyboardFrame = (info[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue() 
      self.arrangeViewOffsetFromKeyboard() 
     } 

    } 

    func keyboardWillHide(notification: NSNotification) 
    { 
     self.keyboardIsShowing = false 

     self.returnViewToInitialFrame() 
    } 

    func arrangeViewOffsetFromKeyboard() 
    { 
     var theApp: UIApplication = UIApplication.sharedApplication() 
     var windowView: UIView? = theApp.delegate!.window! 

     var textFieldLowerPoint: CGPoint = CGPointMake(self.commentView!.frame.origin.x, self.commentView!.frame.origin.y + self.commentView!.frame.size.height) 

     var convertedTextViewLowerPoint: CGPoint = self.view.convertPoint(textFieldLowerPoint, toView: windowView) 

     var targetTextViewLowerPoint: CGPoint = CGPointMake(self.commentView!.frame.origin.x, self.keyboardFrame.origin.y - kPreferredTextViewToKeyboardOffset) 

     var targetPointOffset: CGFloat = targetTextViewLowerPoint.y - convertedTextViewLowerPoint.y 
     var adjustedViewFrameCenter: CGPoint = CGPointMake(self.view.center.x, self.view.center.y + targetPointOffset) 

     UIView.animateWithDuration(0.2, animations: { 
      self.view.center = adjustedViewFrameCenter 
     }) 
    } 

    func returnViewToInitialFrame() 
    { 
     var initialViewRect: CGRect = CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height) 

     if (!CGRectEqualToRect(initialViewRect, self.view.frame)) 
     { 
      UIView.animateWithDuration(0.2, animations: { 
       self.view.frame = initialViewRect 
      }); 
     } 
    } 

    func textViewDidBeginEditing(textView: UITextView) { 
     // 
     print("text view did begin editing\n") 
     // 
     if(self.keyboardIsShowing) 
     { 
      self.arrangeViewOffsetFromKeyboard() 
     } 
    } 

    func textViewDidChange(textView: UITextView) { 
     print("text view did change\n") 
     let textViewFixedWidth: CGFloat = self.textView.frame.size.width 
     let newSize: CGSize = self.textView.sizeThatFits(CGSizeMake(textViewFixedWidth, CGFloat(MAXFLOAT))) 
     var newFrame: CGRect = self.textView.frame 
     // 
     var textViewYPosition = self.textView.frame.origin.y 
     var heightDifference = self.textView.frame.height - newSize.height 
     // 
     if (abs(heightDifference) > 5) { 
      newFrame.size = CGSizeMake(fmax(newSize.width, textViewFixedWidth), newSize.height) 
      newFrame.offset(dx: 0.0, dy: heightDifference) 
      // 
      updateParentView(heightDifference: heightDifference) 
     } 
     self.textView.frame = newFrame 
    } 

    func updateParentView(#heightDifference: CGFloat) { 
     // 
     var newContainerViewFrame: CGRect = self.commentView.frame 
     // 
     var containerViewHeight = self.commentView.frame.size.height 
     print("container view height: \(containerViewHeight)\n") 
     // 
     var newContainerViewHeight = containerViewHeight - heightDifference 
     print("new container view height: \(newContainerViewHeight)\n") 
     // 
     var containerViewHeightDifference = containerViewHeight - newContainerViewHeight 
     print("container view height difference: \(containerViewHeightDifference)\n") 
     // 
     newContainerViewFrame.size = CGSizeMake(self.commentView.frame.size.width, newContainerViewHeight) 
     // 
     newContainerViewFrame.offset(dx: 0.0, dy: containerViewHeightDifference) 
     // 
     // self.commentView.frame = newContainerViewFrame 
    } 

    func textViewDidEndEditing(textView: UITextView) { 
     // 
     print("text view did end editing\n") 
     // 
     textView.resignFirstResponder() 
    } 

} 
+0

मैं उलझन में हूं। क्या 'newContainterViewHeight'' '' के बजाय 'कंटेनर व्यूइट + ऊंचाई डिफरेंस' होना चाहिए? – skyline75489

उत्तर

3

यह मेरे लिए काम करता है। मेरे मामले में, मेरे पास तालिका दृश्य के नीचे टेक्स्ट व्यू है। इसलिए, जैसा कि पाठ दृश्य ऊंचाई में बढ़ता है, मूल दृश्य वास्तव में बदलने की आवश्यकता नहीं है - से ऊपर टेक्स्ट दृश्य को आकार बदलने की आवश्यकता है (मेरे लिए यह तालिका दृश्य था)। तो, यहां मैंने updateParentView फ़ंक्शन में लागू किया है।

func updateParentView(heightDifference: CGFloat) { 
    // 
    var newContainerViewFrame: CGRect = self.commentTableView.frame 
    // 
    let containerViewHeight = self.commentTableView.frame.size.height 
    print("container view height: \(containerViewHeight)\n") 
    // 
    let newContainerViewHeight = containerViewHeight + heightDifference 
    print("new container view height: \(newContainerViewHeight)\n") 
    // 
    let containerViewHeightDifference = containerViewHeight - newContainerViewHeight 
    print("container view height difference: \(containerViewHeightDifference)\n") 
    // 
    newContainerViewFrame.size = CGSizeMake(self.commentTableView.frame.size.width, newContainerViewHeight) 
    // 
    newContainerViewFrame.origin.y - containerViewHeightDifference 
    // 
    self.commentTableView.frame = newContainerViewFrame 
} 

अब, ऊंचाई में पाठ दृश्य बढ़ जाती है के रूप में, तालिका दृश्य newContainerViewFrame.origin.y - containerViewHeightDifference प्रति "ऊपर स्लाइड"। नीचे स्क्रीनशॉट देखें।

Example Screenshot

4

मैं एक बहुत आसान जवाब है, मुझे आशा है कि यह कर सकते हैं। मेरे पास जो कुछ है वह बहुत सरल है और कोड को हल नहीं करता है। मैंने सभी बाधाओं द्वारा किया था। मैं

enter image description here

यह कैसे यह वास्तव में लग रहा है

तरह

enter image description here

यह महत्वपूर्ण है कि है क्या है

यह है: यहाँ वहाँ छवियों की एक जोड़ी मेरे expain मदद करने के लिए कर रहे हैं TextView इस संपत्ति को संपत्ति निरीक्षक में अनचेक किया गया है:

enter image description here

फिर आप प्रत्येक दृश्य के लिए शीर्ष, अग्रणी, पीछे और नीचे सेट करें और कोई ऊंचाई सेट करें। इसके माता-पिता के विचारों के साथ टाइप करते समय सब कुछ बढ़ेगा! :)

संबंधित मुद्दे