2017-10-26 16 views
0

자동 레이아웃 및 Stackview를 사용하여 무언가를 달성하려고합니다. 아래에 표시된대로 UIView, UITextView 및 UIView 함께 세로 Stackview 있습니다.스크롤 사용 가능한 스택보기 내에서 UITextView 확장

enter image description here

여기 이전의 답변을 확인했지만이를 달성하기 클린 솔루션을 찾을 수 없습니다.

UITextView은 편집 할 수 있으며 사용자가 입력 할 때 확장해야합니다.이 경우 IB의 UITextView에 대한 스크롤을 사용 중지했습니다. UITextView에 설정된 높이 제약 조건이 "10보다 크거나 같음"으로 설정되고 줄 수가 0으로 설정되어 있기 때문에 UITextView은 런타임에 사용자가 입력하는 동안 내부 높이를 사용합니다. UIStackView 아래쪽 가장자리가 키패드 액세서리의 위쪽 가장자리에 도달 할 때까지 UITextView를 계속 확장해야합니다. 나는 어느 정도 이해할 수있는 stackview needs Y position or height하지만 내가 고정 된 높이나 바닥을 주면 오류가 계속 발생하고, 스택 뷰를 최상위, 후행 및 앞쪽 가장자리에 고정 된 UITextView 부분을 확장 할 수있었습니다. UITextView는 단순히 확장되지 않습니다.

또한 UITextView가 키보드 액세서리보기의 위쪽 가장자리에 도달했을 때 확장을 중지하는 방법을 잘 모르겠습니다. I 가지고

코드 원경

let allowedHeight = self.view.frame.height - (self.keyboardHeight! + self.accessory.frame.height) 

기본적으로 keyboardheight + 소품 뷰 높이를 감산함으로써 뷰 프레임의 허용 높이를 찾는 것이다. 이 계산은 올바르게 수행됩니다. 다음으로 UITextView에서 스크롤을 활성화/비활성화하는 것이 효과적 일 것을 기대하면서이 작업을 수행합니다 (그러나 textViewDidChange). 그러나 전체 텍스트보기가 모든 키 스트로크에서 위아래로 점프하기 때문에 명확하게 doens't하지 않습니다.

func textViewDidChange(_ textView: UITextView) { 
    if stackView.frame.height >= allowedHeight{ 
      textView.isScrollEnabled = true 
     } 

    if stackView.frame.height < allowedHeight{ 
      textView.isScrollEnabled = false 
     } 
} 

내가 원하는 것을 달성하는 가장 좋은 방법은 무엇입니까?

답변

1

커플 노트 ...

나는 당신이 당신의 UIStackView의보다 오히려 UITextView의 최대 높이를 설정하는 더 나을 것 같아요. 텍스트 뷰는 내용에 따라 확장/축소되므로 <= 높이 제한을 설정할 수 있습니다.

위쪽 및 아래쪽보기에서 사용되는 세로 크기와 모든 간격을 더한 "elementsHeight"와 "최대 텍스트보기 높이"를 뷰 높이에서 elementsHeight 빼기로 설정하고 보이면 키보드 높이를 뺍니다.

"최대 텍스트보기 높이"가 변경 될 때 텍스트보기의 높이 제약 조건을 업데이트하십시오.

그런 다음 텍스트 뷰의 .contentSize ...에 대한 옵서버를 설정하고 "최대 텍스트보기 높이"와 비교하여 .contentSize.height을 기반으로 스크롤링을 사용하거나 사용하지 않도록 설정하십시오.

서브 뷰가 배치 될 때 크기를 업데이트하고 재귀 루프에 들어 가지 않도록하려면 후프 점프가 필요합니다.나는 그것을 설정하는 방법

은 다음과 같습니다

enter image description here

텍스트 뷰의 초기 높이 제약이 <= 40 -하지만이 코드를 통해 때마다 변경 될 것이다 즉,별로 중요하지 않습니다 views 레이아웃을 다르게합니다.

저는 GitHub에 대한 예를 보여줍니다. 실제로 작동하지만 실제로는 시작점 일뿐입니다. 관심이 있는지 살펴보고 따로 선택하십시오. https://github.com/DonMag/ExpandingTextView

+0

감사합니다. 코드에 감사드립니다. 나는 이것을 시도 할 것이다. – Annjawn

+0

이것은 완벽하게 작동합니다. iPhone X의 한 가지주의 사항. iPhone X의 안전 영역은 기본적으로 y 오프셋에 22pt를 추가합니다. 따라서 스택 뷰의 y 오프셋을 추가하면 키보드 뒤의 모든 것을 22px 아래로 밀었습니다. 세계의 끝이 아니라 쉽게 고칠 수 있습니다. 다시 감사합니다! – Annjawn