정확히 같은 문제가 있었으므로 생각을 추가하고 싶습니다.
나는 UITextView
텍스트 정렬이 더 좋았 기 때문에 사용 하고 있었지만 (당시에는 사용할 수 없었던 정당화 UILabel
), 비 대화 형 비 스크롤 가능을 "시뮬레이션"하기 위해 UILabel
완전히 스크롤링, 수신 거부 및 사용자 상호 작용을 완전히 해제했습니다. .
물론 문제는 텍스트가 동적이며 너비는 고정되어 있지만 새 텍스트 값을 설정할 때마다 높이를 다시 계산해야한다는 것이 었습니다.
boundingRectWithSize
내가 볼 수 있듯이, 나에게 전혀 효과가 없었습니다. UITextView
마진을 boundingRectWithSize
세지 않는 여백을 추가하는 것이 었습니다. 따라서 검색 된 높이가 boundingRectWithSize
원래보다 작아졌습니다.
텍스트는 빠르게 업데이트되지 않았기 때문에 2-3 초마다 가장 많이 업데이트 될 수있는 일부 정보에만 사용됩니다. 다음과 같은 접근 방식을 결정했습니다.
/* This f is nested in a custom UIView-inherited class that is built using xib file */
-(void) setTextAndAutoSize:(NSString*)text inTextView:(UITextView*)tv
{
CGFloat msgWidth = tv.frame.size.width; // get target's width
// Make "test" UITextView to calculate correct size
UITextView *temp = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, msgWidth, 300)]; // we set some height, really doesn't matter, just put some value like this one.
// Set all font and text related parameters to be exact as the ones in targeted text view
[temp setFont:tv.font];
[temp setTextAlignment:tv.textAlignment];
[temp setTextColor:tv.textColor];
[temp setText:text];
// Ask for size that fits :P
CGSize tv_size = [temp sizeThatFits:CGSizeMake(msgWidth, 300)];
// kill this "test" UITextView, it's purpose is over
[temp release];
temp = nil;
// apply calculated size. if calcualted width differs, I choose to ignore it anyway and use only height because I want to have width absolutely fixed to designed value
tv.frame = CGRectMake(tv.frame.origin.x, tv.frame.origin.y, msgWidth, tv_size.height );
}
* 위의 코드는 내 소스에서 직접 복사되지 않았 으므로이 기사에 필요하지 않은 다른 것들로부터 조정 / 삭제해야했습니다. 복사하여 붙여 넣기 및 작업 코드로 작성하지 마십시오.
명백한 단점은 각 호출에 대해 할당 및 해제가 있다는 것입니다.
그러나 boundingRectWithSize가 텍스트를 그리는 방법과 텍스트 그리기의 크기와 구현을 계산하는 방법 사이의 호환성에 의존하지 않는 장점이 있습니다 UITextView
(또는 UILabel
대신 대체로 사용할 수 UITextView
있음 UILabel
). 애플이 가질 수있는 "버그"는 이런 식으로 피할 수 있습니다.
추신 : 당신은이 "임시"가 필요하지 않을 것 같고 목표에서 직접 UITextView
요청할 sizeThatFits
수는 있지만 그것은 효과가 없었습니다. 논리는 작동해야한다고 말하고 임시 할당 / 해제는 UITextView
필요하지 않지만 그렇지 않았습니다. 그러나이 솔루션은 내가 설정 한 모든 텍스트에 대해 완벽하게 작동했습니다.
lineBreakMode
있습니까?