Ios 评估NSString大小以填充UITextView

Ios 评估NSString大小以填充UITextView,ios,objective-c,nsstring,uitextview,font-size,Ios,Objective C,Nsstring,Uitextview,Font Size,我有一个不可滚动的UITextView,我想用文本动态填充这个框架 这是我的班级代码: #import "ViewController.h" #define FONT_SIZE 17.0f @interface ViewController ()<UITextViewDelegate> @property (nonatomic, weak) IBOutlet UITextView * textview; -(IBAction)changeText:(UIButton*)send

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

这是我的班级代码:

#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
#导入“ViewController.h”
#定义字体大小17.0f
@界面视图控制器()
@属性(非原子,弱)IBOutlet UITextView*textview;
-(iAction)changeText:(UIButton*)发送方;
@结束
@实现视图控制器
-(无效)viewDidLoad{
[超级视图下载];
self.automaticallyAdjustsScrollViewInsets=否;
NSString*纯文本=@"同一天的知识是最优秀的,是最优秀的,是最优秀的,是最优秀的,是最优秀的,是最优秀的,是最优秀的,是最优秀的,是最优秀的,是最优秀的,是最优秀的,是最优秀的除非是出于谨慎,否则不应因疏忽而受到惩罚。不应因自由意识而将其视为公民权利的一部分。知识本身不应被视为精英的跛足,不应被视为一种不公平的行为,也不应被视为临时的劳动和财富,而应被视为一种不公平的行为我们的诺斯特鲁德实习律师是一名普通律师,他在法庭上的辩护律师是一名律师,在法庭上的辩护律师是一名律师,在法庭上的辩护律师是一名律师,在法庭上的辩护律师是一名律师我们必须承认,知识的同一性在精英阶层中占有一席之地,在劳工和财产的临时契约中占有一席之地。但是,在最低限度上,我们必须在公共消费品上进行劳动和财产的实践。两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或两人或不属于教区。除非出于谨慎的考虑,否则不应将动物作为劳动的罪过。不应出于良心考虑将动物作为劳动的法律。知识产权应属于精英阶层,不应被剥夺权利,不应被视为劳动和巨大财产我是维尼安,我是诺斯特鲁德,我是一个普通的律师,我是一个律师,我是一个律师,我是一个律师,我是一个律师,我是一个律师,我是一个律师,我是一个律师,我是一个律师公民的权利。知识本身是一种权利,它是一种权利,它是一种权利,它是一种权利,它是一种权利,它是一种权利,它是一种权利,它是一种权利,它是一种权利欧盟宪法无效。除了偶尔的不自卑之外,还必须为保护动物和动物而承担责任。不自由的人有意识地考虑到法律和公民权利的因素。知识本身是一种美德,是一种美德,是一种美德尽管如此,我们还是要在公共法庭上进行实验。两人或两人在法庭上相互指责,因为他们的行为是不合法的。除了偶尔出于谨慎,不应因职权而受到惩罚。事实上,他们是自由的这是一部关于公民权利的法律,它是一部关于公民权利的法律,是一部关于公民权利的法律,是一部关于劳动和财产的临时法律,是一部关于公民权利的法律,是一部关于劳动和财产权利的法律,是一部关于公民权利的法律当然,这是一种不平等的行为。除了偶尔不轻视他人之外,也不能因为工作上的过失而责怪他人的动物和劳动。不自由的人有意识地考虑到公民的法律权利。知识本身可以坐在精英的双腿上,连续的纤毛也可以放在自己的腿上,这是劳动和财富的暂时性酒。但酒是最低限度的,它是一种不可侵犯的劳动,它是一种不可侵犯的劳动。它是一种不可侵犯的权利。除了偶尔出于谨慎,不可作为官方的罪过,不可侵犯动物的劳动权利新台币将被视为法定货币。”;
[自应用文本:纯文本];
}
-(无效)未收到记忆警告{
[超级记忆警告];
//处置所有可以重新创建的资源。
}
-(void)applyText:(NSString*)纯文本
{
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”大小:FONT_size];
[self.textview setTextAlignment:NSTextAlignmentCenter];
//第一种方法
CGSize maximumLabelSize=self.textview.frame.size;
maximumLabelSize.height=9999;
CGSize expectSize=[self.textview sizeThatFits:maximumLabelSize];
NSLog(@“预期高度%f”,预期大小.高度);
//第二种方法
expectSize=[plainText boundingRectWithSize:CGSizeMake(self.textview.frame.size.width,MAXFLOAT)选项:NSStringDrawingUserLineFragmentOrigin属性:@{NSFontAttributeName:self.textview.font}上下文:nil]。大小;
NSLog(@“预期高度2%f”,预期尺寸.高度);
//第三种方法
expectSize=[self-attributedSizeWithFont:self.textview.font maxWidth:self.textview.frame.size.width
CGSize maximumLabelSize = self.textview.frame.size;
maximumLabelSize.height = 9999.
CGSize expectSize = [self.textview sizeThatFits:maximumLabelSize];
UITextView* dummyTextView = [[[UITextView alloc] initWithFrame:  self.textView.frame] autorelease];

dummyTextView.attributedText = [[NSAttributedString alloc] initWithString:plainText];
[dummyTextView.attributedText setFont:[UIFont fontWithName:@"HelveticaNeue" size:FONT_SIZE]];
[dummyTextView.attributedText setTextAlignment:NSTextAlignmentCenter];
[dummyTextView sizeToFit];
CGFloat expectedHeight = dummyTextView.bound.size.height;
- (void)updateTextFont:(UITextView *)textView
{
    // Only run if has text, otherwise it will make infinity loop
    if (textView.text.length == 0 || CGSizeEqualToSize(textView.bounds.size, CGSizeZero)) return;

    /*
     - Update textView font size
     If expectHeight > textViewHeight => descrease font size n point until it reach textViewHeight
     If expectHeight < textViewHeight => inscrease font size n point until it reach textViewHeight
     */
    CGSize textViewSize = textView.frame.size;
    CGFloat fixedWidth = textViewSize.width;
    CGSize expectSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];

    UIFont *expectFont = textView.font;
    if (expectSize.height > textViewSize.height) {
        while ([textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)].height > textViewSize.height) {
            expectFont = [textView.font fontWithSize:(textView.font.pointSize - 0.5)];
            textView.font = expectFont;
        }
    } else {
        while ([textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)].height < textViewSize.height) {
            expectFont = textView.font;
            textView.font = [textView.font fontWithSize:(textView.font.pointSize + 0.5)];
        }
        textView.font = expectFont;
    }
}
self.textview.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height-47);
    self.textview.contentSize = self.textview.frame.size;