2019 년 최신
iOS에서 가장 심각한 버그 중 하나입니다.
여기에 주어진 수업 UITextViewFixed
은 일반적으로 가장 합리적인 솔루션입니다.
수업은 다음과 같습니다.
@IBDesignable class UITextViewFixed: UITextView {
override func layoutSubviews() {
super.layoutSubviews()
setup()
}
func setup() {
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
}
}
인스펙터에서 scrollEnabled를 끄는 것을 잊지 마십시오!
솔루션은 스토리 보드에서 올바르게 작동합니다
솔루션은 런타임에 올바르게 작동합니다
그게 다야, 끝났어.
일반적으로 대부분의 경우 필요한 것입니다 .
텍스트보기의 높이를 즉석 에서 변경하더라도 UITextViewFixed
일반적으로 필요한 모든 것을 수행합니다.
(즉석에서 높이를 변경하는 일반적인 예는 사용자 유형에 따라 높이를 변경하는 것입니다.)
Apple에서 깨진 UITextView는 다음과 같습니다.
여기 있습니다 UITextViewFixed
:
물론 당신은해야합니다
인스펙터에서 scrollEnabled를 끄십시오!
scrollEnabled를 끄는 것을 잊지 마십시오! :)
몇 가지 추가 문제
(1) 유동적이면서 동적으로 변화하는 셀 높이를 가진 테이블의 경우와 같은 비정상적인 경우 애플은 기괴한 일을한다. 그들은 바닥에 여분의 공간을 추가한다 . 아냐! 이것은 iOS에서 가장 분노한 것들 중 하나 여야합니다.
위의 내용에 추가 할 수있는 "빠른 수정 사항"은 일반적으로 그 광기에 도움이됩니다.
...
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
// this is not ideal, but you can sometimes use this
// to fix the "extra space at the bottom" insanity
var b = bounds
let h = sizeThatFits(CGSize(
width: bounds.size.width,
height: CGFloat.greatestFiniteMagnitude)
).height
b.size.height = h
bounds = b
...
(2) 때로는 또 다른 미묘한 Apple 엉망을 해결하려면 다음을 추가해야합니다.
override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
super.setContentOffset(contentOffset, animated: false)
}
(3) 틀림없이 다음을 추가 해야 합니다.
contentInset = UIEdgeInsets.zero
에서 직후 .lineFragmentPadding = 0
에 UITextViewFixed
.
그러나 ... 믿거 나 말거나 ... 현재 iOS 에서는 작동하지 않습니다 ! (2019 년에 확인 됨) 향후 해당 라인을 추가해야 할 수도 있습니다.
UITextView
iOS에서 깨어진 사실 은 모든 모바일 컴퓨팅에서 가장 이상한 것 중 하나입니다. 이 질문의 10 년 기념일은 여전히 고정되어 있지 않습니다!
마지막으로, 텍스트 필드 와 비슷한 팁이 있습니다 : https://stackoverflow.com/a/43099816/294884
완전히 임의의 팁 : 끝에 "..."를 추가하는 방법
종종 "UILabel과 같은"UITextView를 사용하고 있습니다. 따라서 줄임표 "..."를 사용하여 텍스트를 자르기를 원합니다.
그렇다면 "setup"에 세 번째 코드 줄을 추가하십시오.
textContainer.lineBreakMode = .byTruncatingTail
텍스트가 없을 때 높이가 0 인 경우 유용한 팁
텍스트보기를 사용하여 텍스트 만 표시하는 경우가 종종 있습니다. 따라서 사용자는 실제로 아무것도 편집 할 수 없습니다. "0"줄을 사용하면 텍스트 줄 수에 따라 텍스트보기의 높이가 자동으로 변경됩니다.
대단하지만, 텍스트가 전혀 없다면 불행히도 한 줄의 텍스트가 있는 것과 같은 높이를 얻습니다 !! 텍스트 뷰는 절대로 사라지지 않습니다.
"가져 가기"를 원한다면, 이것을 추가하십시오
override var intrinsicContentSize: CGSize {
var i = super.intrinsicContentSize
print("for \(text) size will be \(i)")
if text == "" { i.height = 1.0 }
print(" but we changed it to \(i)")
return i
}
(나는 그것을 '1'로 만들었으므로 무슨 일이 일어나고 있는지, '0'은 괜찮습니다.)
UILabel은 어떻습니까?
텍스트를 표시 할 때 UILabel은 UITextView보다 많은 장점이 있습니다. UILabel은이 QA 페이지에 설명 된 문제를 겪지 않습니다. 실제로 우리 모두가 일반적으로 "포기"하고 UITextView를 사용하는 이유는 UILabel을 다루기가 어렵 기 때문입니다. 특히 UILabel에 padding 을 올바르게 추가하는 것은 엄청나게 어렵습니다 . 여기 사실 "마지막으로"제대로 UILabel의 패딩을 추가하는 방법에 대한 전체 설명이다 https://stackoverflow.com/a/58876988/294884 동적 높이 세포 어려운 레이아웃을하고 있다면 어떤 경우에는, 그것은 때때로 UILabel로 힘들게하는 것이 좋습니다.