2015-02-05 2 views
1

У меня есть прокручиваемый UITextView, и я хочу, чтобы этот кадр содержал текст динамически.оценивая размер NSString для заполнения 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 

но если высота текста оценивается в функции applyText меньше, чем высота рамы, он хорошо работает в противном случае высота измеряется неправильно.

размер TextView является 300x620

любая идея? . Спасибо годов заранее

ответ

1

sizeThatFits: никогда не увеличивает размер, который передается в Чтобы точно измерить минимальный размер, который потребуется, изменить высоту до некоторого большого числа прежде, чем это называется:

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

спасибо, но не работает, то результат будет тот же мой код – giorgio83

0
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; 
+0

вы еще кодирования с Нет АРК? –

+0

Да, некоторая часть моего проекта все еще написана с помощью Non-ARC. Но независимо от того, какой механизм вы используете, если можете держать его под контролем. –

1

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

я использовать эту функцию в этом сообщении для оценки правильного размера шрифта:

Resize font size to fill UITextView?

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

и эти две строки кода, которые я имею в функции applyText:

self.textview.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height-47); 
    self.textview.contentSize = self.textview.frame.size; 

потому что в первый раз кадр UITextView неверен.

благодарственное за поддержку

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