ios - 评估 NSString 大小以填充 UITextView

标签 ios objective-c nsstring uitextview font-size

我有一个不可滚动的 UITextView,我想用文本动态填充此框架。

这是我的类(class)代码:

#import "ViewController.h"

#define FONT_SIZE 17.0f

@interface ViewController ()<UITextViewDelegate>

@property (nonatomic, weak) IBOutlet UITextView * textview;
-(IBAction)changeText:(UIButton*)sender;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.automaticallyAdjustsScrollViewInsets = NO;

    NSString * plainText = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.";

    [self applyText:plainText];
}

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

}

- (void)applyText: (NSString*) plainText
{
    self.textview.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height-47);
    self.textview.contentSize = self.textview.frame.size;

    self.textview.attributedText = [[NSAttributedString alloc] initWithString:plainText];
    [self.textview setFont:[UIFont fontWithName:@"HelveticaNeue" size:FONT_SIZE]];
    [self.textview setTextAlignment:NSTextAlignmentCenter];


    //first method
    CGSize maximumLabelSize = self.textview.frame.size;
    maximumLabelSize.height = 9999;
    CGSize expectSize = [self.textview sizeThatFits:maximumLabelSize];

    NSLog(@"expected height %f",expectSize.height);

    //second method
    expectSize = [plainText boundingRectWithSize:CGSizeMake(self.textview.frame.size.width,MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.textview.font} context:nil].size;

    NSLog(@"expected height 2 %f",expectSize.height);

    //third method
    expectSize = [self attributedSizeWithFont:self.textview.font maxWidth:self.textview.frame.size.width string:plainText];

    NSLog(@"expected height 3 %f",expectSize.height);



    if (expectSize.height <= self.textview.frame.size.height) {

        float fontSize = (FONT_SIZE * expectSize.height)/self.textview.frame.size.height;
        NSLog(@">> font: %.2f",fontSize);

        [self.textview setFont:[UIFont fontWithName:@"HelveticaNeue" size:fontSize]];

    }
    else if (expectSize.height > self.textview.frame.size.height) {

        float fontSize = (FONT_SIZE * self.textview.frame.size.height)/expectSize.height;

        NSLog(@"<< font: %.2f",fontSize);

        [self.textview setFont:[UIFont fontWithName:@"HelveticaNeue" size:fontSize]];

     }
}


- (CGSize) attributedSizeWithFont:(UIFont*) font maxWidth:(CGFloat) width string:(NSString*) string{

    NSMutableParagraphStyle* style = [[NSMutableParagraphStyle alloc] init];
    style.lineBreakMode = NSLineBreakByWordWrapping;
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:string
                                                                         attributes:@{ NSFontAttributeName:font,
                                                                                       NSForegroundColorAttributeName:[UIColor blackColor],
                                                                                       NSParagraphStyleAttributeName:style }];

    CGRect textRect = [attributedText boundingRectWithSize:CGSizeMake(width, MAXFLOAT)
                                                   options:(NSStringDrawingUsesLineFragmentOrigin)
                                                   context:nil];
    CGSize size = textRect.size;
    size.height = ceilf(size.height);
    size.width  = ceilf(size.width);

    return size;
}


-(IBAction)changeText:(UIButton*)sender
{
    NSString * plainText = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.";

    [self applyText:plainText];

}
@end

但如果在 applyText 函数中评估的文本高度小于框架的高度,则效果很好,否则测量的高度是错误的。

TextView 大小为 300x620

有什么想法吗?提前致谢

最佳答案

sizeThatFits: 永远不会增加传入的大小。要准确测量所需的最小大小,请在调用之前将高度更改为某个较大的数字:

CGSize maximumLabelSize = self.textview.frame.size;
maximumLabelSize.height = 9999.
CGSize expectSize = [self.textview sizeThatFits:maximumLabelSize];

关于ios - 评估 NSString 大小以填充 UITextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28350062/

相关文章:

ios - 如何从框架包中加载场景文件 .scn

objective-c - 字符串常量的使用

ios - 如何缩短可能包括的 NSString HFS+ 文件名允许的表情符号最大长度

ios - 无法在 Swift 中的 View Controller 上获得后退按钮

ios - Admob 错误仅发生在一个应用程序上

iphone - 本地化日期不翻译日期

ios - NSMutableRequest 对象主体的分配数据未被释放

iphone - 在 iPhone 编程中追加到 NSString 中间

ios - 从 (_,_,_) 类型的抛出函数 throws -> Void 到非抛出函数类型 (NSData?, NSURLResponse?, NSError?) -> Void 的无效转换

ios - 如何在一起滚动的 UITableView 顶部添加一个 View ,但在滚动后坚持到顶部