에 크기 dynamic.Successfull
을 변경할 수 있습니다! 보기에 두 UITextViews을 추가하고, 그들 사이에 텍스트를 분할하여 이 텍스트 뷰 **
이 솔루션은 작동의 한계를 초과하지 않습니다 콘텐츠의 크기를 가정
**. 복잡해 보이지만 실제로는 매우 간단합니다!
가 내 스토리 보드에 내 추가 :보기에 두 UITextViews 추가 - 난 그냥 아주 자세한 설명 :
1 단계를 작성했습니다. 하나를 다른 것의 바로 위에 놓고 그 사이에 공간이 없도록 놓습니다. 높이 설정에 대해서는 걱정하지 마십시오 (나중에 설정합니다). 보기에
설정 제약 그들은 상단과 하단, 그리고 원하는 패딩을 포함하여 다른 모든 측면에서 컨테이너의 주변 가장자리에서 서로 연결되도록. 즉은 첫 번째 텍스트보기를 상단, 왼쪽 및 오른쪽에서 컨테이너에 묶고 하단에서 두 번째 텍스트보기로 연결합니다. 두 번째 텍스트보기를 아래쪽, 왼쪽 및 오른쪽에서 컨테이너로 묶고 위쪽에서 첫 번째 텍스트보기로 묶습니다. 이렇게하면 내용을 설정할 때 내용이 적절히 늘어나게됩니다.
의 의견의 높이에 어떤 제약 조건을 설정하거나 (제약 관리자에서 경고를 피하기 위해)해야하는 경우, >= 20
가 될 전망 중 하나의 높이를 설정하지 마십시오 비슷하게 작은 숫자. 두 텍스트보기에 대한 스크롤, 수신 거부 및 스크롤 표시기를 비활성화합니다. 이 솔루션은 고정 된 스크롤 할 수없는 높이의 뷰를 사용하므로 내용을 스크롤하려는 경우 UIScrollView 또는 UITableViewCell을 컨테이너로 사용해야합니다.
textView1
및 textView2
처럼 뭔가 이름을 지정,보기 컨트롤러 파일에 두 개의 새로운 텍스트 뷰에 대한 출구를 만듭니다.
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은 내가 그들의 용기 내에서, 위의 내 두 개의 텍스트 뷰 아래 공간의 합계로 설정 한 매크로이다).
그게 전부 야! 행운을 빕니다.
문제는 텍스트가 사라지지 않는다는 것입니다. 문제는 텍스트보기의 높이입니다. 이는 주요 구현 오류와 같습니다. 해결 방법은 UI 세부 정보에 따라 크게 달라집니다. – dasdom
버그처럼 보이지만 컨트롤이 그렇게 행동해서는 안됩니다. 버그 보고서를 Apple에 제출하십시오. –
@dasdom 내 UI에 대한 세부 정보가 도움이 될 수 있습니까? 기본적으로 사용자가 UIScrollView의 맨 아래로 스크롤 할 때마다 더 많은 텍스트가 UITextView에 추가되고 UIScrollView의 contentSize가 업데이트됩니다. 이 문제는 scrollViewDidChange 메서드에서 발생합니다. – SimplyLearning