programing

콘텐츠에 맞게 UITextView 크기를 조정하려면 어떻게 해야 합니까?

bestprogram 2023. 4. 12. 23:05

콘텐츠에 맞게 UITextView 크기를 조정하려면 어떻게 해야 합니까?

를 조정할 수 있는 요?UITextView그용 준거 ?거 거??, 나는 '나에게', '나에게', '나에게', '나에게'가 있다.UITextView다음 한 줄의 텍스트가 포함되어 있습니다.

"Hello world"

그런 다음 다음 텍스트 행을 추가합니다.

"Goodbye world"

에서 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★rect텍스트 뷰의 모든 행을 유지하여 부모 뷰를 적절히 조정할 수 있도록 합니다.

예로서 Calendar를 참조해 셀)이 어떻게 있는지 해 주세요.UITextView포함)을 확장하여 노트 문자열의 모든 텍스트 행을 유지합니다.

이는 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;

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+뿐입니다.

여기에 이미지 설명 입력

6+만(5s 또는 6이 아님)의 경우 UITextView에 "1줄 더 공백"이 추가됩니다."RL 솔루션"은 이 문제를 완벽하게 해결합니다.

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

6+의 「추가 회선」의 문제를 해결합니다.

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

코드별

textView.scrollEnabled = false

스토리보드별

스크롤 활성화의 선택을 취소합니다.

여기에 이미지 설명 입력

이것 말고는 아무것도 할 필요가 없다.

갱신하다

UITextView에서 스크롤을 해제하는 것이 중요합니다.

myTextView.scrollEnabled = @NO

원답

으로 사이징을 UITextView a UITableViewCell 8

  • UITextView a까지UITableViewCell으로 제한하다

  • 를 합니다.UITextView의 »scrollEnabled을 property property로 설정합니다.NO유효하게 , 「」의 이 됩니다UITextView는 콘텐츠 크기와는 무관하지만 스크롤이 비활성화되어 있기 때문에 둘 사이에는 관계가 있습니다.

  • 에서 원래 열하고 있는 으로 열열다른 에서 행 할 수 .viewDidLoad:

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

다이내믹사이징의 경우UITextView입니다. s, 로그그그 s 。가 의 할 수 하는 UITextView , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .

  • 「 」의 실장textViewDidChange:의 of의 UITextViewDelegateprotocol을 하여 "tell"을 합니다.tableView텍스트를 편집할 때마다 자동으로 다시 칠합니다.

     - (void)textViewDidChange:(UITextView *)textView;
     {
         [tableView beginUpdates];
         [tableView endUpdates];
     }
    
  • UITextViewStoryboard ★★★★★★★★★★★★로tableView:cellForRowAtIndexPath:

신속:

textView.sizeToFit()

(한정적인) 경험상,

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

하지 않기 글자로 수 .CGSize실제 필요한 것보다 더 많이.

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

새로운 라인을 존중하는 것 같아요

의 맨 .UITextView코드로 새 UITextView 합니다.sizeOfFont★★★★★★★★★★★★★★★★★★.

iOS6를 할 수 .contentSize[ UITextView ] [ 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;
    }
}

만약 누군가가 여기까지 읽을 용기가 있다면, 나는 페이지 하단에 올바른 해결책을 게시할 것이다.

여기 gitHub repo가 있습니다.이 모든 텍스트를 읽고 싶지 않은 분들을 위해: 크기 조정 가능텍스트 표시

이것은 iOS7(iOs8에서도 동작할 수 있다고 생각합니다)과 자동 레이아웃에서도 동작합니다. 매직 넘버나 레이아웃 같은 건 필요 없어요짧고 우아한 솔루션.

다 하다, 하다, 하다, 하다,updateConstraints 그럼 우리만의 것을 만들어볼까요?ResizableTextView.

첫 전에 알 수 없다는 입니다.viewDidLoad길고 험난한 길을 택하여 글꼴 크기, 줄 바꿈 등을 기준으로 계산할 수 있습니다.하지만 강력한 솔루션이 필요하기 때문에 다음을 수행합니다.

CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];

는 어디에 알 수 . 즉, '전' '후'입니다.viewDidLoadtextView에 높이 또는 이제 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];

현재 우리 반은 다음과 같습니다.

크기 조정 가능TextView.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];

해보셨어요?[textView sizeThatFits:textView.bounds]

편집: sizeThatFits는 크기를 반환하지만 실제로 구성 요소의 크기를 조정하지는 않습니다., 네가 원하는 건지 [textView sizeToFit]이든 당신이 해 보는 이 좋습니다.어느 쪽이든, 당신이 원하는 내용에 딱 맞을지는 모르겠지만, 우선 시도해 보는 것이 좋습니다.

하나의 은 특정 입니다.NSString★★★★

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

지정된 문자열과 지정된 글꼴에 맞는 직사각형의 크기를 반환합니다.원하는 너비와 최대 높이를 가진 크기로 전달한 다음 텍스트에 맞게 반환된 높이를 볼 수 있습니다.줄 바꿈 모드도 지정할 수 있는 버전이 있습니다.

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

우리는 그것을 제약으로 할 수 있다.

  1. UITextView의 높이 제한을 설정합니다.여기에 이미지 설명 입력

2. 해당 높이 구속조건에 대한 IBOutlet을 작성합니다.

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

3. 텍스트 뷰의 대리인을 설정하는 것을 잊지 마십시오.

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;
    }];

}

그 후 다음과 같이 제약조건을 갱신합니다. : )

있지 않습니다.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부터는 UITableView의 자동 레이아웃 기능을 사용하여 커스텀 코드 없이 UITextView의 크기를 자동으로 조정할 수 있습니다.이를 실천하는 프로젝트를 기트허브에 넣었습니다만, 중요한 것은 다음과 같습니다.

  1. UITextView에서는 스크롤을 디세블로 해야 합니다.이것은 프로그래밍 방식으로 또는 인터페이스 빌더를 통해 실행할 수 있습니다.스크롤을 사용하면 더 큰 콘텐츠를 볼 수 있기 때문에 스크롤이 활성화된 경우 크기가 조정되지 않습니다.
  2. [ UITable ViewController ]viewDidLoad ]견적 Row 。를 설정하고 나서, 「」를 설정합니다.rowHeight로로 합니다.UITableViewAutomaticDimension.

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

모든 답변을 검토했는데 모두 너비는 일정하게 유지하고 높이만 조절하고 있습니다.폭도 조정하고 싶은 경우는, 다음의 방법을 간단하게 사용할 수 있습니다.

따라서 텍스트 보기를 구성할 때 set scroll disabled로 설정합니다.

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)
}

출력:

여기에 이미지 설명 입력

여기에 이미지 설명 입력

텍스트 필드의 높이를 텍스트 필드의 높이에 따라 크기를 조정하고 텍스트 필드의 높이에 따라 그 아래에 라벨을 배치하는 방법을 알아냈습니다!여기 암호가 있습니다.

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];

autolayout을 사용하는 남성분들은 sizetofit이 작동하지 않으니 폭 제한을 한 번 확인해 주세요.너비 구속조건을 놓치면 높이가 정확해집니다.

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

[_textView sizeToFit];

여기서 저는 높이에만 신경을 썼고 폭은 고정된 채로 스토리보드에서 TextView의 폭 제한을 놓쳤습니다.

서비스로부터의 다이내믹한 콘텐츠를 표시하기 위해서입니다.

이게 도움이 되길..

다음 사항으로 충분합니다.

  1. 스크롤유효하게 하는 것을 잊지 말아 주세요.UITextView:

여기에 이미지 설명 입력

  1. 자동 레이아웃 구속조건을 올바르게 설정합니다.

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

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

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

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

[myTextView setDelegate: self];

...

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

스크롤 비활성화

제약 조건을 추가하다

텍스트를 추가합니다.

[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;
}

가 '글'을 '글'로 할 때 잘 작동했어요.UITextView특정 영역에 맞춥니다.

// 텍스트가 이미 하위 보기에 추가되어 있어야 합니다. 그렇지 않으면 컨텐츠 보기 크기가 잘못되었습니다.

- (void) reduced Font To Fit : (UIText View*)tv {UIFont *tv.120 =tv.120;이중 pointSize = 글꼴.pointSize;

(tv.contentSize).높이>tv.frame.size.높이&pointSize> 7.0) {점 크기 -= 1.0;UIFont *newFont = [UIFont WithName:font.fontName size:pointSize];
tv.font = newFont;}if (pointSize != 글꼴.pointSize)NSLog(@"%.1f에서 %.1f로 내려감", pointSize, tv.font.pointSize);}

다음은 @jibberd의 빠른 버전입니다.

    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

7.경우 iOS 7.0을 frame.size.heightcontentSize.height안 하고 ) 사용하다[textView sizeToFit].

이 질문을 보세요.

사용자가 텍스트를 바로 쓴 후 TextView에 맞추고 싶은 경우 Swift 5에서 정상적으로 작동합니다.

UITextViewDelegate를 구현하기만 하면 됩니다.

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

다른 사용자가 여기에 온 경우 이 솔루션은 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;

그리고 그건...건배.

이것이 도움이 되기를 바랍니다.

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

텍스트 크기에 따라 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];

텍스트 뷰가 실제로 상승하여 최종 수익 위치를 유지하기를 원하는 사용자용

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);
}

사용할 수 있는 유일한 코드는 위의 jibberd answer와 같이 SizeToFit을 사용하는 코드입니다.그러나 ViewDidAppear에서 호출하거나 UITextView 텍스트 변경 이벤트로 전송하지 않으면 실제로는 수신되지 않습니다.

Nikita Toke의 답변을 바탕으로 iOS 8에서 autolayout으로 동작하는 Swift에서 다음과 같은 솔루션을 찾았습니다.

    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
            }
        }
    }

언급URL : https://stackoverflow.com/questions/50467/how-do-i-size-a-uitextview-to-its-content