2017-03-04 42 views
1

所以我的iOS應用程序有一個UIScrollview設置在故事板上使用自動佈局的頂部,底部,領先和尾隨約束綁定到超級視圖。在scrollview裏面我有stackview和多個垂直堆疊的UITextviews。 scrollview的內容設置很好,我甚至可以上下滾動。UITextview鍵盤處理,當它嵌入在UIScrollView

現在,我的問題來了鍵盤處理。我處理蘋果的文檔中推薦的鍵盤同樣的方式:Apple's Keyboard handling documentation

有問題如下所示僅作參考,但它非常簡單,只是蘋果的例子的複製粘貼的特定代碼:

func keyboardDidShow(notification: NSNotification){ 
    var info = notification.userInfo! 
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size 
    let 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 self.activeTextView != nil { 
     if (!aRect.contains(self.activeTextView!.bounds)){ 
      self.scrollView.scrollRectToVisible(self.activeTextView!.frame, animated: true) 
     } 
    } 
} 

我鍵盤處理代碼適用於UITextFields,但它不適用於UITextFields。 self.scrollView.scrollRectToVisible(self.activeTextView!.frame, animated: true)被調用,但不會發生滾動。

我研究了一下,發現,蘋果不建議嵌入的UITextView一個UIScrollView內:Placing a text view inside of a scroll view

配售滾動視圖的內部文本視圖。文本視圖處理自己的滾動。您不應該在滾動視圖中嵌入文本視圖對象。如果這樣做,可能會導致意外的行爲,因爲兩個對象的觸摸事件可能混淆並被錯誤地處理。

但是,我真的需要這個「自動」滾動到隱藏文本視圖,以使用與UITextFields相同的方式。有什麼建議麼??

PS:我應該提到,我不介意禁用UITextViews中的滾動操作,因爲我已經使用自動佈局自動調整UITextViews以適合其內容。

回答

1

我會說,雖然不建議在UIScrollView中嵌入UITextView,但它不應阻止滾動視圖滾動到特定幀。你可以檢查你試圖滾動的框架(self.activeTextView.frame)是否「正確」?意想不到的UITextView-scrollVI內行爲的一部分可能是textview的框架不是預期的。對不起,我在路上,我不能嘗試重現你的問題,並提供更具體的解決方案,但檢查框架,如果不是你期望的(給定UITextView在窗口中的位置),那麼也許嘗試轉換矩形從它的父視圖到你的主視圖 - 如果這是問題,那麼解決方法是將UITextView嵌入到UIView中,並在鍵盤出現時滾動到UIView的框架。

試試這段代碼筆記本測試過)...

self.scrollView.scrollRectToVisible(self.activeTextView!.superview!.frame, animated: true) 
0

我推薦你使用下面的scrollview自動處理鍵盤。

https://github.com/michaeltyson/TPKeyboardAvoiding

+0

看起來像一個很好的圖書館,雖然它會是我的用例矯枉過正。也許是爲了更大的項目。但對於我的用例KevinM的答案效果很好。 –