UITextView wraps text when built with iOS 7 SDK

后端 未结 4 668
北恋
北恋 2021-02-03 11:49

I have a UITextView inside a UIScrollView that worked perfectly fine on iOS 6 built from xcode 4.x, however now building with

4条回答
  •  北恋
    北恋 (楼主)
    2021-02-03 12:27

    try using:

    [textView.text boundingRectWithSize:CGSizeMake(txtFrame.size.width, CGFLOAT_MAX)
                               options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                               attributes:[NSDictionary dictionaryWithObjectsAndKeys:textView.font,NSFontAttributeName, nil] context:nil];
    

    The string measuring seems pretty buggy. This is the only option combination that gives the right size, for the testing I have done.

    I'm using the following code with success in iOS7 (it's a UITextField with a minimum and maximum height. When the text's height get larger then MAX_HEIGHT_MESSAGE_TEXTBOX, scrollbars appears in the UITextField).

    const float MAX_HEIGHT_MESSAGE_TEXTBOX = 80;
    const float MIN_HEIGHT_MESSAGE_TEXTBOX = 30;
    
    
    - (void)setFrameToTextSize:(CGRect)txtFrame textView:(UITextView *)textView
    {
    
        if(txtFrame.size.height > MAX_HEIGHT_MESSAGE_TEXTBOX)
        {
            //OK, the new frame is to large. Let's use scroll
            txtFrame.size.height = MAX_HEIGHT_MESSAGE_TEXTBOX;
            textView.scrollEnabled = YES;
            [textView scrollRangeToVisible:NSMakeRange([textView.text length], 0)];
        }
        else
        {
            if (textView.frame.size.height < MIN_HEIGHT_MESSAGE_TEXTBOX) {
                 //OK, the new frame is to small. Let's set minimum size
                txtFrame.size.height = MIN_HEIGHT_MESSAGE_TEXTBOX;
            }
            //no need for scroll
            textView.scrollEnabled = NO;
        }
        //set the frame
        textView.frame = txtFrame;
    }
    
    - (void)setframeToTextSize:(UITextView *)textView animated:(BOOL)animated
    {
        //get current height
        CGRect txtFrame = textView.frame;
    
        //calculate height needed with selected font. Note the options.
        //append a new line to make space for the cursor after user hit the return key
        txtFrame.size.height =[[NSString stringWithFormat:@"%@\n ",textView.text]
                               boundingRectWithSize:CGSizeMake(txtFrame.size.width, CGFLOAT_MAX)
                               options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                               attributes:[NSDictionary dictionaryWithObjectsAndKeys:textView.font,NSFontAttributeName, nil] context:nil].size.height;
    
        if (animated) {
            //set the new frame, animated for a more nice transition
            [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseOut |UIViewAnimationOptionAllowAnimatedContent animations:^{
                [self setFrameToTextSize:txtFrame textView:textView];
            } completion:nil];
        }
        else
        {
            [self setFrameToTextSize:txtFrame textView:textView];
        }
    }
    
    - (void)textViewDidChange:(UITextView *)textView
    {
        [self setframeToTextSize:textView animated:YES];
    }
    

    EDIT

    When the string measuring is correct, you might need to change the lineBreakModeon the UITextView's textContainer. (NSTextContainer is a new class in iOS7, containing information about how text should be laid out):

    textView.textContainer.lineBreakMode = NSLineBreakByCharWrapping; // default is NSLineBreakByWordWrapping 
    

    Good luck!

提交回复
热议问题