UITextView wraps text when built with iOS 7 SDK

后端 未结 4 669
北恋
北恋 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:10

    method sizeWithFont:(UIFont *)font constrainedToSize ..." has been deprecated in iOS 7.

    It would function properly.

    Check out its alternate in iOS 7

    Instance Method of NSString

    -(CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:
    
    (NSDictionary *)attributes context:(NSStringDrawingContext *)context
    

    Check this answer out. Replacement for deprecated sizeWithFont: in iOS 7?

    0 讨论(0)
  • 2021-02-03 12:22

    for response to "Thanks, but this doesn't seem to address my issue. I am using both flexible width and height. It seems like i'm getting the correct dimensions returned as the textview scrolls enough in both directions, however the text itself is still being wordwrapped."

    I fixed this by [textView sizeToFit];

    0 讨论(0)
  • 2021-02-03 12:23

    I think you want to calculate the content size so that you can increase the content size of scroll view too. if yes Use this link, https://stackoverflow.com/a/19152955/1023083

    0 讨论(0)
  • 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!

    0 讨论(0)
提交回复
热议问题