내용에 맞게 UITextView의 크기를 어떻게 조정합니까?


521

UITextView내용에 맞게 크기를 조정하는 좋은 방법이 있습니까? 예 UITextView를 들어 한 줄의 텍스트가 포함되어 있다고 가정 해보십시오 .

"Hello world"

그런 다음 다른 텍스트 줄을 추가하십시오.

"Goodbye world"

Cocoa Touch rect에서 텍스트보기의 모든 라인을 유지하여 부모보기를 적절히 조정할 수 있는 좋은 방법이 있습니까?

다른 예로, 캘린더 응용 프로그램의 이벤트에 대한 메모 필드를보십시오 UITextView. 메모 문자열에 모든 텍스트 줄을 포함 하도록 셀 (및 그 안에 포함 된)이 어떻게 확장 되는지 확인하십시오 .


수락 된 계산은 불필요한 계산으로 이어 지므로이 문제에 대한 contentSize 속성이 있습니다. 정답을 업데이트하십시오.
Juan Boero

답변:


610

이것은 iOS 6.1 및 iOS 7 모두에서 작동합니다.

- (void)textViewDidChange:(UITextView *)textView
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    textView.frame = newFrame;
}

또는 Swift (iOS 11의 Swift 4.1과 호환)

let fixedWidth = textView.frame.size.width
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
textView.frame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)

iOS 6.1을 지원하려면 다음을 수행해야합니다.

textview.scrollEnabled = NO;

1
UITextView의 크기를 UITableViewCell로 조정하기 위해 iOS 7에서 테스트되었습니다. 정말 잘 작동합니다. 이것은 마침내 나를 위해 일한 유일한 대답입니다. 감사!
Alex

37
textview.scrollEnabled = NO;iOS 7에서도 텍스트가 잘리지 않도록 해야했습니다 .
Brian

19
CGFLOAT_MAX대신 매크로 를 사용하는 것이 좋습니다 MAXFLOAT. 32/64 비트 플랫폼 모두에 적합합니다.
Eonil

2
다음 줄에 들어가기 전에 약간의 변동에 직면하는 사람은 다음과 같이 덧붙인다.`NSRange bottom = NSMakeRange (textView.text.length -1, 1); [textView scrollRangeToVisible : bottom];`
ajay_nasa

4
Swift 버전에서 sizeThatFits (...)에 대한 별도의 호출이 두 번있는 이유는 무엇입니까? 첫 번째 줄은 무엇입니까?
nekonari

576

iOS 7 이상에서는 더 이상 작동하지 않습니다.

실제로 UITextView내용의 정확한 높이로 크기를 조정하는 매우 쉬운 방법 이 있습니다. 를 사용하여 수행 할 수 있습니다 UITextView contentSize.

CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

주의 할 점은 올바른가 있다는 것입니다 contentSize에만 사용할 수 있습니다 (가) UITextView와 함께보기에 추가되었습니다 addSubview. 그 전에는frame.size

자동 레이아웃이 켜져 있으면 작동하지 않습니다. 자동 레이아웃을 사용하는 경우 일반적인 접근 방식은이 sizeThatFits방법 을 사용하고 constant높이 제약 조건 에서 값을 업데이트하는 것 입니다.

CGSize sizeThatShouldFitTheContent = [_textView sizeThatFits:_textView.frame.size];
heightConstraint.constant = sizeThatShouldFitTheContent.height;

heightConstraint 스토리 보드에서 만든 높이 제약 조건에 속성을 연결하여 IBOutlet을 통해 일반적으로 설정하는 레이아웃 제약 조건입니다.


다음과 같은 경우 놀라운 답변 인 2014 년에 추가하십시오.

[self.textView sizeToFit];

iPhone6 ​​+ 에서만 동작에 차이가 있습니다 .

enter image description here

6+ 만 사용하면 (5 초 또는 6 아님) UITextView에 "하나 이상의 빈 줄"이 추가됩니다. "RL 솔루션"은이 문제를 완벽하게 해결합니다.

CGRect _f = self.mainPostText.frame;
_f.size.height = self.mainPostText.contentSize.height;
self.mainPostText.frame = _f;

6+에서 "추가 라인"문제를 해결합니다.


2
당신은 내 하루를 구했습니다. 나는 이것을 잊어 버린 selfCalculating 클래스 함수 확장으로 고심하고있었습니다. 감사합니다.
Lukasz

4
아하! 텍스트보기 높이를 설정 한 다음 포함보기의 높이를 조정하고있었습니다. 분명히 텍스트보기 높이를 조정했을 때. 포함 뷰 높이를 먼저 설정하면 예상대로 작동합니다.
핫 릭

11
[_textView sizeToFit]를 사용하면 contentSize 속성을 새로 고쳐서이를 scrollView에 미리 추가 할 필요가 없습니다.
로드리고

1
자동 레이아웃을 사용 layoutIfNeeded하는 경우 슈퍼 뷰를 호출 하십시오. 그런 다음에서 높이를 가져올 수 있습니다 contentSize.
phatmann

4
외부 컨테이너의 크기를 조정하는 것입니다. 이 동작은 iOS 7에서 변경되었습니다. 링크 된 질문에서 sizeToFit 및 layoutIfNeeded를 추가 할 위치를 표시합니다.
Henrik Erlandsson

93

동적으로 크기 조정하려면 UITextView돌며을 UITableViewCell, 나는 다음과 같은 조합이 아이폰 OS 8 SDK와 Xcode를 6에서 작동 발견

  • a를 UITextViewA를UITableViewCell 하고 측면으로 제한
  • UITextViewscrollEnabled속성을로 설정하십시오 NO. 스크롤을 사용하면의 프레임이 UITextView내용 크기와 무관하지만 스크롤을 사용하지 않으면 둘 사이의 관계가 있습니다.
  • 테이블이 원래 기본 행 높이 44를 사용하는 경우 자동으로 행 높이를 계산하지만 기본 행 높이를 다른 것으로 변경 한 경우 다음에서 행 높이 자동 계산을 수동으로 켜야 할 수도 있습니다 viewDidLoad.

    tableView.estimatedRowHeight = 150;
    tableView.rowHeight = UITableViewAutomaticDimension;

읽기 전용 동적 크기 조정 UITextView의 경우 그게 전부입니다. 사용자가의 텍스트를 편집 할 수있게하려면 UITextView다음을 수행해야합니다.

  • 프로토콜 의 textViewDidChange:방법을 구현하고 텍스트를 편집 할 때마다 다시 그립니다.UITextViewDelegatetableView

    - (void)textViewDidChange:(UITextView *)textView;
    {
        [tableView beginUpdates];
        [tableView endUpdates];
    }
  • 그리고 UITextView어딘가에 Storyboard또는 내부에 대리인 을 설정하는 것을 잊지 마십시오tableView:cellForRowAtIndexPath:


나에게 가장 좋은 대답. 완벽하게 작동하고 UITableViewAutomaticDimension이 iOS 5에 추가되어 이전 버전과 호환됩니다.
smmelzer

4
나를 위해 일하지 않았다. textViewDidChange 메서드를 사용하면 문자를 입력 할 때마다 테이블 뷰가 튀어 오릅니다. 내가 제안하는 것은 textView가있는 행에 대해 tableView : cellForRowAtIndexPath 메소드에서 해당 메소드를 사용하는 대신 읽기 전용 모드로 설정된 경우 .scrollEnabled를 NO로 설정하고 편집 뷰 세트를 사용하는 경우 YES로 스크롤하십시오. 이렇게하면 표시 할 때 항상 전체 텍스트가 표시되고 편집 할 때 전체 텍스트로 시작하고 추가 텍스트를 추가 할 때 이전 텍스트가 맨 위로 스크롤되는 동일한 크기로 유지됩니다.
SimonTheDiver

3
또한 빈 텍스트 필드에는 높이가 없으며 편집을 시작하기 위해 탭 할 수 없으므로 텍스트 뷰에> = 높이 제한을 추가했습니다.
SimonTheDiver

탁월한 솔루션. 나 tableView.rowHeight = UITableViewAutomaticDimension에게는 불필요했다.
Christopher Pickslay 2012 년

브렛 도널드 다시 감사합니다! 나는 이것을하는 방법을 잊어 버렸고 1 년 후에 다시 한번 당신의 대답을 찾았습니다 😀.
Eric Conner

74

코드와 스토리 보드를 모두 사용하는 매우 쉬운 작업 솔루션.

코드 별

textView.scrollEnabled = false

스토리 보드

스크롤링 활성화를 선택 취소 하십시오

enter image description here

이것 외에는 아무것도 할 필요가 없습니다.


5
이 대답은 맞습니다. StoryBoard에는 UILabel과 같은 TextView AutoSize가 있습니다. 우리가해야 할 일은 scrollEnabled = false로 설정하는 것입니다.
pnavk

4
본질적으로 이것은 정확합니다. 자동 레이아웃 제약 조건을 사용하고 스크롤을 종료하면 모든 것이 작동합니다.
Dan Rosenstark

2
고마워 스토리 보드 나 코드에서 스크롤을 비활성화하는 것은 간단했습니다. 줄이 0 인 UILabel과 같습니다.
samir105

@Mansuu .... 내장 콘텐츠 크기를 재정의하기 위해 할 수있는 일이 있기 때문에 보장되는 솔루션은 아니며보기가 배치 된 후 텍스트를 변경하면 설정하지 않으면 업데이트되지 않습니다 또한. 그러나 텍스트 필드에서 numberOfLines = 0을 설정해도 마찬가지입니다. 이것이 작동하지 않으면 암시 적으로 높이를 설정하는 다른 구속 조건이있을 수 있습니다.
Jake T.

2
@iOS 높이 제약 조건을 추가하는 경우 제약 조건 우선 순위를 낮추면 작동하지 않습니다.
Alok

61

빠른 :

textView.sizeToFit()

14
또한 이것이 작동하려면 스크롤링을 false로 설정해야한다는 것을 알았습니다. textView.scrollEnabled = false
tmarkiewicz

1
당신은 textView.sizeToFit 후 textView.layoutIfNeeded을 () ()를 호출하는 것을 기억해야한다
다니엘 쿠타

5
@tmarkiewicz 텍스트가 장치의 화면에 맞을 때 작동하지만 텍스트가 화면의 공간보다 클 때 문제가됩니다. 나머지 텍스트를보기 위해 스크롤 할 수 없습니다.
Francisco Romero

이것이 답입니다 !!! 더 복잡한 솔루션이 필요 없습니다 !!! @FranciscoRomero 왜 textview를 테이블 셀이나 colleciton 뷰 셀에 넣지 않더라도 항상 테이블이나 colleciton 뷰를 스크롤 할 수 있습니다 ....
Ben Smith

23

나의 (제한된) 경험에서

- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode

개행 문자를 존중하지 않으므로 CGSize실제로 필요한 것보다 훨씬 짧을 수 있습니다 .

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size

개행을 존중하는 것 같습니다.

또한 텍스트는 실제로의 맨 위에 렌더링되지 않습니다 UITextView. 내 코드에서의 새로운 높이를 메소드가 UITextView반환 한 높이보다 24 픽셀 더 크게 설정했습니다 sizeOfFont.


3
마치 UILabel에 텍스트를 그리는 것처럼 크기를 가져옵니다. 해당 크기를 uitextview의 프레임으로 설정하면 여전히 스크롤이 필요합니다.
Kevlar

22

iOS6에서는 contentSize텍스트를 설정 한 직후 UITextView 의 속성을 확인할 수 있습니다 . iOS7에서는 더 이상 작동하지 않습니다. iOS7에 대해이 동작을 복원하려면 UITextView의 서브 클래스에 다음 코드를 배치하십시오.

- (void)setText:(NSString *)text
{
    [super setText:text];

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
        CGRect rect = [self.textContainer.layoutManager usedRectForTextContainer:self.textContainer];
        UIEdgeInsets inset = self.textContainerInset;
        self.contentSize = UIEdgeInsetsInsetRect(rect, inset).size;
    }
}

2
이에 대한 자세한 내용은 어디서 볼 수 있습니까? iOS 7의 새로운 동작과 관련하여 완전히 잃어 버렸습니다.
Stian Høiland

가변 CGSize 크기의 의미는 무엇입니까?
Tchelow

나는 크기를 제거했는데 거기에 없었습니다.
phatmann

18

누군가 가이 시점까지 읽을 용감한 (또는 절망적 인 경우) 페이지 하단에 올바른 해결책을 게시 할 것입니다.

모든 텍스트를 읽고 싶지 않은 사람들을위한 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];

4
사용 CGFLOAT_MAX하지 말고 사용하십시오 FLT_MAX.
rob mayoff

이 멋진 솔루션에 대해 둘 이상의 투표권을 줄 수 있기를 바랍니다.
스쿠터

13

시도해 보았 니 [textView sizeThatFits:textView.bounds] ?

편집 : sizeThatFits는 크기를 반환하지만 실제로 구성 요소의 크기를 조정하지는 않습니다. 그게 당신이 원하는 것인지 확실하지 않은지 확실하지 않습니다 [textView sizeToFit]. 두 경우 모두 원하는 콘텐츠에 완벽하게 맞는지 모르겠지만 가장 먼저 시도해보십시오.


2
sizetofit 하루 저장
michaelsnowden

9

또 다른 방법은 특정 문자열이 NSString방법 을 사용하여 취할 크기를 찾는 것입니다 .

-(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size

주어진 문자열과 주어진 문자열에 맞는 사각형의 크기를 반환합니다. 원하는 너비와 최대 높이의 크기를 입력하면 텍스트에 맞게 반환 된 높이를 볼 수 있습니다. 줄 바꿈 모드도 지정할 수있는 버전이 있습니다.

그런 다음 반환 된 크기를 사용하여보기 크기를 적합하게 변경할 수 있습니다.


8

UITextView편리 하지 않은 경우 (예 : 테이블 뷰 셀의 크기를 조정하는 경우) 문자열을 측정하여 크기를 계산 한 다음의 양쪽에 8pt의 패딩을 고려해야합니다 UITextView. 예를 들어 원하는 텍스트보기 너비를 알고 해당 높이를 계산하려는 경우 :

NSString * string = ...;
CGFloat textViewWidth = ...;
UIFont * font = ...;

CGSize size = CGSizeMake(textViewWidth - 8 - 8, 100000);
size.height = [string sizeWithFont:font constrainedToSize:size].height + 8 + 8;

여기서, 각각의 8 개는 4 개의 패딩 된 가장자리 중 하나를 설명하며 100000은 매우 큰 최대 크기로 사용됩니다.

실제로, font.leading높이에 여분의 것을 추가 할 수도 있습니다 . 이렇게하면 텍스트 아래에 빈 줄이 추가됩니다. 텍스트보기 바로 아래에 시각적으로 무거운 컨트롤이있는 경우 더보기 좋을 수 있습니다.


iOS 8.1의 완벽한 결과
Logic

패딩은 나를위한 열쇠였습니다
thibaut noah

8

우리는 제약에 의해 그것을 할 수 있습니다.

  1. UITextView의 높이 제약 조건을 설정하십시오. 여기에 이미지 설명을 입력하십시오

해당 높이 제약 조건에 대한 IBOutlet을 만듭니다.

 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *txtheightconstraints;

3. textview에 대리자를 설정하는 것을 잊지 마십시오.

4.

-(void)textViewDidChange:(UITextView *)textView
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    NSLog(@"this is updating height%@",NSStringFromCGSize(newFrame.size));
    [UIView animateWithDuration:0.2 animations:^{
                  _txtheightconstraints.constant=newFrame.size.height;
    }];

}

다음과 같이 제약 조건을 업데이트하십시오 :)


그것은 환상적인 별명입니다!
Fattie

상수를 설정 한 후에는 [textView layoutIfNeeded]; 애니메이션 블록에서. (자동 레이아웃 애니메이션은 그렇게합니다.)
Will Larche

7

다음은 충분합니다.

  1. 스크롤링NO 로 설정 하십시오 UITextView.

여기에 이미지 설명을 입력하십시오

  1. 자동 레이아웃 제약 조건을 올바르게 설정하십시오.

을 사용할 수도 있습니다 UITableViewAutomaticDimension.


6

Mike McMaster의 답변과 함께 다음과 같은 작업을 수행 할 수 있습니다.

[myTextView setDelegate: self];

...

- (void)textViewDidChange:(UITextView *)textView {
  if (myTextView == textView) {
     // it changed.  Do resizing here.
  }
}

6

내부 텍스트에 따라 텍스트 필드의 높이를 조정하고 텍스트 필드의 높이를 기준으로 그 아래에 레이블을 정렬하는 방법을 찾았습니다! 코드는 다음과 같습니다.

UITextView *_textView = [[UITextView alloc] initWithFrame:CGRectMake(10, 10, 300, 10)];
NSString *str = @"This is a test text view to check the auto increment of height of a text view. This is only a test. The real data is something different.";
_textView.text = str;

[self.view addSubview:_textView];
CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 5 + frame.origin.y + frame.size.height, 300, 20)];
lbl.text = @"Hello!";
[self.view addSubview:lbl];

여기서 UILabel의 y-좌표에서 '5'는 textView와 Label 사이의 간격입니다.
dheeraj

6

자동 레이아웃을 사용하는 사람과 sizetofit이 작동하지 않으면 너비 제한을 한 번 확인하십시오. 너비 제한을 놓치면 높이가 정확합니다.

다른 API를 사용할 필요가 없습니다. 한 줄만으로 모든 문제를 해결할 수 있습니다.

[_textView sizeToFit];

여기서는 높이에만 관심을 두어 너비를 고정하고 스토리 보드에서 TextView의 너비 제한을 놓쳤습니다.

그리고 이것은 서비스에서 동적 컨텐츠를 표시하는 것이 었습니다.

이것이 도움이 되길 바랍니다 ..


6

iOS 8부터는 UITableView의 자동 레이아웃 기능을 사용하여 사용자 지정 코드없이 UITextView의 크기를 자동으로 조정할 수 있습니다. 이 작업을 보여주는 프로젝트를 github에 넣었 지만 여기에 핵심이 있습니다.

  1. UITextView에는 스크롤 기능이 비활성화되어 있어야하며 프로그래밍 방식으로 또는 인터페이스 빌더를 통해 수행 할 수 있습니다. 스크롤을 사용하면 더 큰 컨텐츠를 볼 수 있으므로 스크롤이 사용 가능한 경우 크기가 조정되지 않습니다.
  2. UITableViewController에 대한 viewDidLoad에서 expectedRowHeight에 대한 값을 설정 한 다음로 설정해야 rowHeight합니다 UITableViewAutomaticDimension.

- (void)viewDidLoad {
    [super viewDidLoad];
    self.tableView.estimatedRowHeight = self.tableView.rowHeight;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}
  1. 프로젝트 배포 대상은 iOS 8 이상이어야합니다.

1
이런 종류의 답변은 권장되지 않습니다. 관련 코드를 여기에 게시해야합니다.
Antzi

5

나는 모든 대답을 검토했으며 모두 고정 너비를 유지하고 높이 만 조정합니다. 너비도 조정하려면이 방법을 매우 쉽게 사용할 수 있습니다.

따라서 텍스트보기를 구성 할 때 스크롤을 사용하지 않도록 설정하십시오.

textView.isScrollEnabled = false

그런 다음 대리자 메서드에서 다음 func textViewDidChange(_ textView: UITextView)코드를 추가하십시오.

func textViewDidChange(_ textView: UITextView) {
    let newSize = textView.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude))
    textView.frame = CGRect(origin: textView.frame.origin, size: newSize)
}

출력 :

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


위임 방법은 @ 피터 Stajger라고 점점되지 않는다
.... Mansuu

4

텍스트를 만들어야 할 때 잘 작동했습니다. UITextView 특정 영역에 맞는 .

// 텍스트가 서브 뷰에 이미 추가되어 있어야합니다. 그렇지 않으면 contentviewsize가 잘못됩니다.

-(void) reduceFontToFit : (UITextView *) tv {
    UIFont * font = tv.font;
    double pointSize = font.pointSize;

    while (tv.contentSize.height> tv.frame.size.height && pointSize> 7.0) {
        pointSize-= 1.0;
        UIFont * newFont = [UIFont fontWithName : font.fontName 크기 : pointSize];
        tv.font = newFont;
    }
    if (pointSize! = font.pointSize)
        NSLog (@ "글꼴 % .1f에서 % .1f로 글꼴 다운", pointSize, tv.font.pointSize);
}

4

여기 @jhibberd의 빠른 버전이 있습니다

    let cell:MsgTableViewCell! = self.tableView.dequeueReusableCellWithIdentifier("MsgTableViewCell", forIndexPath: indexPath) as? MsgTableViewCell
    cell.msgText.text = self.items[indexPath.row]
    var fixedWidth:CGFloat = cell.msgText.frame.size.width
    var size:CGSize = CGSize(width: fixedWidth,height: CGFloat.max)
    var newSize:CGSize = cell.msgText.sizeThatFits(size)
    var newFrame:CGRect = cell.msgText.frame;
    newFrame.size = CGSizeMake(CGFloat(fmaxf(Float(newSize.width), Float(fixedWidth))), newSize.height);
    cell.msgText.frame = newFrame
    cell.msgText.frame.size = newSize        
    return cell

6
질문은 실제로 언어에 구애받지 않습니다. UIKit 관련 질문에 대한 모든 답변을 신속하게 작성하고 신속한 포트를 작성해야합니까? 시끄러운 대화를 만드는 것 같습니다.
eremzeit

이 질문들 대부분은 특정한 프로그래밍 언어가 없기 때문에 빠른 언어를 검색하더라도 구글에서 찾을 수 있습니다.
Fareed Alnamrouti

4

스크롤 비활성화

속박 추가

그리고 당신의 텍스트를 추가

[yourTextView setText:@"your text"];
[yourTextView layoutIfNeeded];

당신이 사용하는 경우 UIScrollView이것을 추가해야합니다;

[yourScrollView layoutIfNeeded];

-(void)viewDidAppear:(BOOL)animated{
    CGRect contentRect = CGRectZero;

    for (UIView *view in self.yourScrollView.subviews) {
         contentRect = CGRectUnion(contentRect, view.frame);
    }
    self.yourScrollView.contentSize = contentRect.size;
}


2

UITextViewDelegate를 사용하는 것이 가장 쉬운 방법입니다.

func textViewDidChange(_ textView: UITextView) {
    textView.sizeToFit()
    textviewHeight.constant = textView.contentSize.height
}

1

도움이 되었기를 바랍니다:

- (void)textViewDidChange:(UITextView *)textView {
  CGSize textSize = textview.contentSize;
  if (textSize != textView.frame.size)
      textView.frame.size = textSize;
}

작동하지 않습니다! 이 오류가 발생합니다 : "좌변이 대입의 왼쪽 피연산자로 필요"
거대한

에만 할당 할 수 있습니다 textView.frame.
jweyrich

1

다른 사람이 여기에 오면이 솔루션이 나를 위해 일합니다. 1 "Ronnie Liew"+4 "user63934"(내 텍스트는 웹 서비스에서 도착했습니다) : 1000을 적어 둡니다 ( "내 경우에는 너무 큰 것은 없습니다")

UIFont *fontNormal = [UIFont fontWithName:FONTNAME size:FONTSIZE];

NSString *dealDescription = [client objectForKey:@"description"];

//4
CGSize textSize = [dealDescription sizeWithFont:fontNormal constrainedToSize:CGSizeMake(containerUIView.frame.size.width, 1000)];

CGRect dealDescRect = CGRectMake(10, 300, containerUIView.frame.size.width, textSize.height);

UITextView *dealDesc = [[[UITextView alloc] initWithFrame:dealDescRect] autorelease];

dealDesc.text = dealDescription;
//add the subview to the container
[containerUIView addSubview:dealDesc];

//1) after adding the view
CGRect frame = dealDesc.frame;
frame.size.height = dealDesc.contentSize.height;
dealDesc.frame = frame;

그리고 그건 ... 건배


1

텍스트의 크기에 따라 UITextView의 높이를 조정하는 가장 좋은 방법.

CGSize textViewSize = [YOURTEXTVIEW.text sizeWithFont:[UIFont fontWithName:@"SAMPLE_FONT" size:14.0]
                       constrainedToSize:CGSizeMake(YOURTEXTVIEW.frame.size.width, FLT_MAX)];

또는 당신은 사용할 수 있습니다

CGSize textViewSize = [YOURTEXTVIEW.text sizeWithFont:[UIFont fontWithName:@"SAMPLE_FONT" size:14.0]
                       constrainedToSize:CGSizeMake(YOURTEXTVIEW.frame.size.width, FLT_MAX) lineBreakMode:NSLineBreakByTruncatingTail];

1

textview가 실제로 위로 이동하여 결론을 유지하려는 사람들을 위해

CGRect frame = textView.frame;
frame.size.height = textView.contentSize.height;

if(frame.size.height > textView.frame.size.height){
    CGFloat diff = frame.size.height - textView.frame.size.height;
    textView.frame = CGRectMake(0, textView.frame.origin.y - diff, textView.frame.size.width, frame.size.height);
}
else if(frame.size.height < textView.frame.size.height){
    CGFloat diff = textView.frame.size.height - frame.size.height;
    textView.frame = CGRectMake(0, textView.frame.origin.y + diff, textView.frame.size.width, frame.size.height);
}

1

작동하는 유일한 코드는 위의 jhibberd 답변에서와 같이 'SizeToFit'을 사용하는 코드이지만 ViewDidAppear 에서 호출 하거나 UITextView 텍스트 변경 이벤트에 연결 하지 않으면 실제로 선택되지 않습니다 .


1

Nikita Took의 답변을 바탕으로 Swift의 다음 솔루션에 도달했으며 자동 레이아웃을 사용하여 iOS 8에서 작동합니다.

    descriptionTxt.scrollEnabled = false
    descriptionTxt.text = yourText

    var contentSize = descriptionTxt.sizeThatFits(CGSizeMake(descriptionTxt.frame.size.width, CGFloat.max))
    for c in descriptionTxt.constraints() {
        if c.isKindOfClass(NSLayoutConstraint) {
            var constraint = c as! NSLayoutConstraint
            if constraint.firstAttribute == NSLayoutAttribute.Height {
                constraint.constant = contentSize.height
                break
            }
        }
    }

1

신속한 답변 : 다음 코드는 textView의 높이를 계산합니다.

                let maximumLabelSize = CGSize(width: Double(textView.frame.size.width-100.0), height: DBL_MAX)
                let options = NSStringDrawingOptions.TruncatesLastVisibleLine | NSStringDrawingOptions.UsesLineFragmentOrigin
                let attribute = [NSFontAttributeName: textView.font!]
                let str = NSString(string: message)
                let labelBounds = str.boundingRectWithSize(maximumLabelSize,
                    options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                    attributes: attribute,
                    context: nil)
                let myTextHeight = CGFloat(ceilf(Float(labelBounds.height)))

이제 textView의 높이를 myTextHeight


죄송합니다, 무엇을 의미 하는가하는 것은 : let attribute = [NSFontAttributeName: textView.text.font!] 이 정말 스위프트 코드는 오류없이)하셨습니까? let attribute = [NSFontAttributeName: textView.font!]
Massmaker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.