2014-05-10 1 views
9

UIScrollView에 스크롤 할 수없는 UITextView이 포함되어 있고 텍스트를 동적으로 UITextView에 추가합니다. UIScrollView은 TextView 프레임을 기반으로 contentSize를 조정합니다. 그러나 UITextView의 높이가 8192를 초과하면 텍스트가 보이지 않게됩니다 (텍스트가 강조 표시되고 돋보기를 통해 텍스트의 일부가 보이기 위해 돋보기를 사용할 수 있기 때문에 텍스트는 보이지 않습니다). 이에 따라 크기 UITextView높이가 8192.0에 도달 한 후 UITextView 텍스트가 보이지 않게됩니다.

CGRect textviewFrame = self.TextView.frame; 
    textviewFrame.size.height = [self textViewHeightForAttributedText:self.TextView.attributedText andWidth:320.0]; 
    self.TextView.frame = textviewFrame; 
    self.ScrollView.contentSize = self.TextView.frame.size; 

도우미 기능 :

- (CGFloat)textViewHeightForAttributedText:(NSAttributedString *)text andWidth:(CGFloat)width 
{ 
    UITextView *textView = [[UITextView alloc] init]; 
    [textView setAttributedText:text]; 
    CGSize size = [textView sizeThatFits:CGSizeMake(width, FLT_MAX)]; 
    return size.height; 
} 

나는 8193과에 최대 크기를 강제로 그것을 명시 적으로 밖으로 테스트 때까지 here 미해결이었다 똑같은 문제 몰랐어요 문제가 발생했습니다 (8192의 최대 크기가 텍스트가 올바르게 표시되는 동안). 누구든지이 문제를 해결하기 전에 작업을 알고 있습니까? 감사합니다

+0

문제는 텍스트가 사라지지 않는다는 것입니다. 문제는 텍스트보기의 높이입니다. 이는 주요 구현 오류와 같습니다. 해결 방법은 UI 세부 정보에 따라 크게 달라집니다. – dasdom

+0

버그처럼 보이지만 컨트롤이 그렇게 행동해서는 안됩니다. 버그 보고서를 Apple에 제출하십시오. –

+0

@dasdom 내 UI에 대한 세부 정보가 도움이 될 수 있습니까? 기본적으로 사용자가 UIScrollView의 맨 아래로 스크롤 할 때마다 더 많은 텍스트가 UITextView에 추가되고 UIScrollView의 contentSize가 업데이트됩니다. 이 문제는 scrollViewDidChange 메서드에서 발생합니다. – SimplyLearning

답변

3

나는 최근에이 문제에 부딪 혔고 그 주위를 효과적으로 해결했습니다. iOS 버그 IMHO 같지만 실제로는 그렇지 않습니다 ... CALayer 크기에 실질적인 제한이 있으며 8K 개의 높은 텍스트를 그리는 데 오랜 시간이 걸립니다. 애플이 의도 한 것처럼하고 텍스트의 비트를 렌더링하는 것이 훨씬 낫다. 그래서 UITextView가 UIScrollView를 확장하는 이유이다.

문제는 UITextView가 다른 UI 비트와 쉽게 통합되지 않는다는 것입니다. 필자는 단일 UITextView를 사용하여 기사를 렌더링하는 뉴스 응용 프로그램을 작업 중이며 위와 아래에 별도의 UI (제목 및 단추 등)가 있으며 스크롤 가능한 단일 컨테이너에 모두 호스팅되어 있습니다.

내가 발견 한 솔루션은 두 개의보기로 UITextView를 분할하는 것입니다 ... 프레임이 전체 텍스트 크기 (즉, UITextView의 contentSize와 동일한 크기)이고 UITextView의 superview 인 전용 UITextView 컨테이너. 자식 UITextView의 프레임은 외부 스크롤 가능한 컨테이너의 경계로 설정되어야합니다.

그렇다면 키 - 값 관찰을 사용하여 외부 스크롤 가능한 컨테이너보기의 contentOffset 속성을 모니터해야합니다 (필자의 경우 UICollectionView 임). 해당 contentOffset이 변경되면 UITextView의 contentOffset을 업데이트하고 (1) UITextView 레이어의 transform 속성을 업데이트합니다. 해당 변형 속성을 업데이트하면 UITextView가 현재 보이는 요소의 수퍼 뷰를 채우도록 고정됩니다. 그러나 UITextView의 contentOffset을 업데이트하기 때문에이 속임수는 사용자에게는 전혀 보이지 않습니다 ... UITextView가 단순히 매우 큰 것처럼 보이고 동작합니다.

-4

안녕하세요. 나는 대답하기가 늦지 않았습니다. 너와 같은 문제가있어. 이것은 내 솔루션입니다 :

textView.scrollEnabled = YES;  
contentTextView.attributedText = finalAttrString; 
// contentTextView.text = [attrString string]; 
contentTextView.font = kFont(contentTextFS + [valueOfStepper intValue]); 

[contentTextView sizeToFit]; 
contentTextView.height += 1;//This is the key code 
//contentTextView.height = 8192.0f 

그들 내가 문제를 해결하고 내가 여기를 원하는 사용자를위한 완전한 기능을 솔루션의 아이폰 OS 8

+0

textView == contentTextView – fltx

+0

질문과 관련된 내용은 무엇입니까? –

1

에 크기 dynamic.Successfull을 변경할 수 있습니다! 보기에 두 UITextViews을 추가하고, 그들 사이에 텍스트를 분할하여 텍스트 뷰 **

이 솔루션은 작동의 한계를 초과하지 않습니다 콘텐츠의 크기를 가정

**. 복잡해 보이지만 실제로는 매우 간단합니다!

가 내 스토리 보드에 내 추가 :보기에 두 UITextViews 추가 - 난 그냥 아주 자세한 설명 :

1 단계를 작성했습니다. 하나를 다른 것의 바로 위에 놓고 그 사이에 공간이 없도록 놓습니다. 높이 설정에 대해서는 걱정하지 마십시오 (나중에 설정합니다). 보기에

설정 제약 그들은 상단과 하단, 그리고 원하는 패딩을 포함하여 다른 모든 측면에서 컨테이너의 주변 가장자리에서 서로 연결되도록. 은 첫 번째 텍스트보기를 상단, 왼쪽 및 오른쪽에서 컨테이너에 묶고 하단에서 두 번째 텍스트보기로 연결합니다. 두 번째 텍스트보기를 아래쪽, 왼쪽 및 오른쪽에서 컨테이너로 묶고 위쪽에서 첫 번째 텍스트보기로 묶습니다. 이렇게하면 내용을 설정할 때 내용이 적절히 늘어나게됩니다.

의 의견의 높이에 어떤 제약 조건을 설정하거나 (제약 관리자에서 경고를 피하기 위해)해야하는 경우, >= 20가 될 전망 중 하나의 높이를 설정하지 마십시오 비슷하게 작은 숫자.

두 텍스트보기에 대한 스크롤, 수신 거부 및 스크롤 표시기를 비활성화합니다. 이 솔루션은 고정 된 스크롤 할 수없는 높이의 뷰를 사용하므로 내용을 스크롤하려는 경우 UIScrollView 또는 UITableViewCell을 컨테이너로 사용해야합니다.

textView1textView2처럼 뭔가 이름을 지정,보기 컨트롤러 파일에 두 개의 새로운 텍스트 뷰에 대한 출구를 만듭니다.

2 단계 - 설정 textContainerInsets 제로 :

0으로 모두 텍스트 뷰에 textContainerInset 속성을 설정하거나 사용자 정의 런타임을 사용하여 속성 :

또는 코드 :

self.textView1.textContainerInset = UIEdgeInsetsZero; 
self.textView2.textContainerInset = UIEdgeInsetsZero; 

이렇게하면 표시 할 공간이 앱에 표시되지 않습니다. 귀는 콘텐츠가 설정 될 때 두보기 사이에 나타나며보기 주위의 다른 공백에는 영향을 미치지 않아야합니다.

3 단계 - 콘텐츠 분할로 설정하고 뷰의 높이를 업데이트

는 단순히 뷰 컨트롤러 파일 (viewDidLoad)에 다음 코드를 복사 한 콘텐츠에 contentString 변수를 설정하십시오.

/* Content is split across two UITextViews to avoid max drawing height */ 

NSString *contentString = @"Some very long piece of text..."; 

// Set text 
NSArray *components = [contentString componentsSeparatedByString:@"\n"]; 
NSInteger halfLength = [components count]/2; 
NSArray *firstHalf = [components subarrayWithRange:NSMakeRange(0, halfLength)]; 
NSArray *secondHalf = [components subarrayWithRange:NSMakeRange(halfLength, [components count] - halfLength)]; 
NSString *contentString1 = [firstHalf componentsJoinedByString:@"\n"]; 
NSString *contentString2 = [secondHalf componentsJoinedByString:@"\n"]; 
self.textView1.text = contentString1; 
self.textView2.text = contentString2; 

// Set text view heights 
CGFloat fixedWidth1 = self.textView1.frame.size.width; 
CGFloat fixedWidth2 = self.textView2.frame.size.width; 
CGSize newSize1 = [self.textView1 sizeThatFits:CGSizeMake(fixedWidth1, CGFLOAT_MAX)]; 
CGSize newSize2 = [self.textView2 sizeThatFits:CGSizeMake(fixedWidth2, CGFLOAT_MAX)]; 
CGRect newFrame1 = self.textView1.frame; 
CGRect newFrame2 = self.textView2.frame; 
newFrame1.size = CGSizeMake(fmaxf(newSize1.width, fixedWidth1), MIN(newSize1.height, 8192)); 
newFrame2.size = CGSizeMake(fmaxf(newSize2.width, fixedWidth2), MIN(newSize2.height, 8192)); 
self.textView1.frame = newFrame1; 
self.textView2.frame = newFrame2; 

이 코드는 가장 가까운 개행을 찾기 위해 대략 중간에 contentString을 분할합니다. 콘텐츠를 다른 캐릭터로 분리하려면 위에 표시된 \n 번을 모두 원하는대로 분할하면됩니다.

4 단계 - 컨테이너 뷰의 높이를 설정합니다

설정 위에서 설정 한 당신의 두 개의 텍스트 뷰의 높이를 더한 어떤 추가 공간에 컨테이너 뷰 (어떤 다른있는 ScrollView, tableViewCell) 및 아래에.

CGRect viewFrame = self.myView.frame; 
viewFrame.size.height = MIN(self.textView1.frame.size.height, 8192) + MIN(self.textView2.frame.size.height, 8192) + kTextViewContainerPadding; 
[self.myView setFrame:viewFrame]; 

는 (내 코드에서 kTextViewContainerPadding은 내가 그들의 용기 내에서, 위의 내 두 개의 텍스트 뷰 아래 공간의 합계로 설정 한 매크로이다).

그게 전부 야! 행운을 빕니다.

관련 문제