I have a UITextView
inside a UIScrollView
that worked perfectly fine on iOS 6
built from xcode 4.x
, however now building with
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?
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];
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
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 lineBreakMode
on 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!