2017-03-04 7 views
1

그래서 iOS 응용 프로그램에는 superview에 바인딩 된 위쪽, 아래쪽, 선행 및 후행 제약 조건이있는 autolayout을 사용하여 스토리 보드에 UIScrollview가 설정되어 있습니다. scrollview 안에 여러 개의 UITextviews 세로로 스택 된 stackview 있습니다. 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)이 호출되었지만 스크롤이 발생하지 않습니다.

나는 조금 연구하고 애플은있는 UIScrollView 안에 UITextView를 내장하지 않는 것이 좋습니다 것을 발견 Placing a text view inside of a scroll view

스크롤 뷰의 내부 텍스트 뷰를 배치. 텍스트보기는 자신의 스크롤을 처리합니다. 스크롤 뷰에 텍스트 뷰 객체를 포함하지 않아야합니다. 이렇게하면 두 오브젝트의 터치 이벤트가 혼동되어 잘못 처리 될 수 있기 때문에 예기치 않은 동작이 발생할 수 있습니다.

그러나 UITextFields와 동일한 방식으로 숨겨진 textview를 스크롤하려면이 "자동"스크롤이 정말로 필요합니다. 어떤 제안 ??

추 신 : autolayout을 사용하여 contentsize에 맞게 UITextViews를 이미 자동 조정하므로 UITextViews에서 스크롤을 해제해도 상관 없습니다.

답변

1

UIScrollView에 UITextView를 포함하는 것은 좋지 않지만 스크롤 뷰가 특정 프레임으로 스크롤되는 것을 막지는 못합니다. 스크롤하려는 프레임 (self.activeTextView.frame)이 "올바른지"를 확인할 수 있습니까? 예기치 않은 UITextView-inside-scrollview 동작의 일부는 textview의 프레임이 예상 한 것이 아닐 수 있습니다. 미안 해요. 길에 있는데 문제를 재현 해보고 좀 더 구체적인 해결책을 제시 할 수는 없지만 프레임을 확인하고 기대하지 않았던 (창에서 UITextView의 위치 지정) 다음 rect를 변환하려고 시도합니다. 부모보기에서 기본보기로 - 그게 문제가 해결되지 않으면 UITextView를 UIView 안에 포함시키고 키보드가 나타날 때 UIView의 프레임으로 스크롤하는 것이 좋습니다.

테스트 한 노트) ...

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

키보드를 자동으로 처리하려면 다음과 같은 스크롤 뷰를 사용하는 것이 좋습니다. 내 유스 케이스에 대한 잔인한 것이지만

https://github.com/michaeltyson/TPKeyboardAvoiding

+0

좋은 라이브러리처럼 보인다. 아마 더 큰 프로젝트를 위해서. KevinM의 나의 유스 케이스에 대한 답변은 훌륭했습니다. –