2013-11-13 2 views
2

Мне нужно создать UITextView программно, но я столкнулся с некоторыми проблемами с настройкой его размера.Как изменить размер UITextView в соответствии с содержимым с фиксированной шириной

Пусть у меня есть предложение, с несколькими линиями:

S = @ "Hello World \ nHello Мир \ nHello Мир \ п";

Теперь я хочу выяснить, какую высоту мне нужно отобразить, и соответственно установить высоту моего UITextView (ширина должна быть исправлена). Ниже мой код:

CGSize size = [text sizeWithFont:_FONT_MYRIADPRO(20.0f) constrainedToSize:CGSizeMake(300, 1000)]; 

    _textBox.text = text; 
    _textBox.frame = CGRectMake(10, 10, 300, size.height); 
    _textBox.font = _FONT_MYRIADPRO(20.0f); 
    _textBox.textColor = _COLOR_BLACK; 
    _textBox.backgroundColor = _COLOR_BLUE_DARK; 

    self.frame = CGRectMake(0, 0, 320, _textBox.frame.size.height + 2 * 10); 

    [self addSubview:_textBox]; 

Однако результат, как:

enter image description here

Я пробовал много других способов, как вызов

[_textBox sizeToFit] 

который также терпит неудачу, потому что я хотите исправить ширину.

Я также попытался

NSAttributedString *titleText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: _FONT_MYRIADPRO(20.0f)}]; 
    CGRect bound = [titleText boundingRectWithSize:CGSizeMake(300, 1000) options:NSStringDrawingUsesLineFragmentOrigin context:nil]; 

    _textBox.text = text; 
    _textBox.frame = CGRectMake(10, 10, 300, bound.size.height); 

также терпит неудачу, и результат будет таким же, как на картинке выше.

Может ли кто-нибудь мне помочь?

+0

теперь вы хотите только зафиксировать ширину в зависимости от длины строки? – chancyWu

+0

Вы пытаетесь исправить ширину после использования sizeToFit? – chancyWu

+0

@Chancy Я хочу загрузить текст динамически, поддерживая ширину UITextView. Таким образом, мне нужно настроить высоту в соответствии с загружаемым текстом – HanXu

ответ

0

Я делаю несколько тестов для этого случая. Я думаю, нам лучше добавить descender и привести к росту. Пожалуйста, обратитесь к https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/Introduction/Introduction.html за деталями значений descender и ведущих.

Мой пример кода, как показано ниже:

// 
// RootViewController.m 
// TextViewSize 
// 
// Created by AnkyHe on 11/13/13. 
// Copyright (c) 2013 Gery Studio. All rights reserved. 
// 
#import <QuartzCore/QuartzCore.h> 

#import "RootViewController.h" 

#define TextFont ([UIFont systemFontOfSize:20.0f]) 

static NSString *textContent = nil; 
static NSUInteger const LineNum = 10; 

@interface RootViewController() 

@property (nonatomic, weak) UITextView *textView; 

@end 

@implementation RootViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    NSMutableArray *lines = [[NSMutableArray alloc] initWithCapacity:LineNum]; 
    for (int i = 0; i < LineNum; ++i) { 
     [lines addObject:[NSString stringWithFormat:@"%d Hello world", i]]; 
    } 

    textContent = [lines componentsJoinedByString:@"\n"]; 

    self.view.backgroundColor = [UIColor whiteColor]; 

    UITextView *textView = [[UITextView alloc] init]; 
    self.textView = textView; 
    self.textView.text = textContent; 
    self.textView.font = TextFont; 
    [self.view addSubview:self.textView]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

    CGRect textRect = [textContent boundingRectWithSize:CGSizeMake(300, 1000) 
               options:NSStringDrawingUsesLineFragmentOrigin 
              attributes:@{NSFontAttributeName:TextFont} 
               context:nil]; 

    CGSize size = textRect.size; 
    self.textView.frame = CGRectMake(0, 0, 300, size.height + TextFont.descender + TextFont.leading); 
    self.textView.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds)); 
} 

@end 

Выход, как показано ниже: enter image description here

+0

Вы пробовали другой текст? Как 10 строк «Hello World»? Кажется, проблема все еще существует. Мой оригинальный метод отлично работает с UILabel, и теперь я нахожу, что в UITextView после каждой строки будет дополнительный 4pt, который не вычисляется методом NSString, как [boundingRectWithSize] ... Знаете ли вы, что это дополнительный 4pt является? – HanXu

+0

Я тестирую 10 строк, и все в порядке. Пожалуйста, прочтите мой пересмотренный код. – AnkyHe

Смежные вопросы