누군가 가이 시점까지 읽을 용감한 (또는 절망적 인 경우) 페이지 하단에 올바른 해결책을 게시 할 것입니다.
모든 텍스트를 읽고 싶지 않은 사람들을위한 gitHub 저장소는 다음과 같습니다. resizableTextView
이것은 iOs7 (iOs8과 함께 작동한다고 생각합니다) 및 자동 레이아웃과 함께 작동합니다. 당신은 마법의 숫자가 필요하지 않습니다, 레이아웃을 비활성화하고 그런 것들. 짧고 우아한 솔루션.
모든 제약 조건 관련 코드는 updateConstraints
메소드 로 이동해야한다고 생각합니다 . 자, 스스로 만들어 보자 ResizableTextView
.
여기서 우리가 만나는 첫 번째 문제는 viewDidLoad
방법 전에 실제 콘텐츠 크기를 모른다는 것입니다 . 길고 버그가 많은 길을 가고 글꼴 크기, 줄 바꿈 등을 기반으로 계산할 수 있지만 강력한 솔루션이 필요하므로 다음과 같이하십시오.
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
이제 우리는 어디에 있든 관계없이 실제 contentSize를 알고 viewDidLoad
있습니다. 이제 스토리 보드 또는 코드를 통해 textView에 높이 제한을 추가하십시오 (어떻든 상관 없음). 우리는 그 값을 다음과 같이 조정합니다 contentSize.height
:
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
마지막으로해야 할 일은 수퍼 클래스에게를 알려주는 것 updateConstraints
입니다.
[super updateConstraints];
이제 우리 수업은 다음과 같습니다.
ResizableTextView.m
- (void) updateConstraints {
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
[super updateConstraints];
}
예쁘고 깨끗 하죠? 컨트롤러 에서 해당 코드를 처리 할 필요가 없습니다 !
하지만 기다려!
아니 애니메이션!
변경 사항을 쉽게 애니메이션으로 적용하여 textView
부드럽게 늘릴 수 있습니다. 예를 들면 다음과 같습니다.
[self.view layoutIfNeeded];
// do your own text change here.
self.infoTextView.text = [NSString stringWithFormat:@"%@, %@", self.infoTextView.text, self.infoTextView.text];
[self.infoTextView setNeedsUpdateConstraints];
[self.infoTextView updateConstraintsIfNeeded];
[UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
[self.view layoutIfNeeded];
} completion:nil];