UITextView обертывает текст при создании с помощью iOS 7 SDK
У меня есть UITextView
внутри a UIScrollView
, который отлично работал на iOS 6
, построенном из xcode 4.x
, однако теперь с помощью xcode 5
он работает неправильно, даже на iOS 6
.
Проблема заключается в том, что текст обтекает ширину экрана, даже если UITextView
и UIScrollView
имеют большую ширину. Я использую этот код для разработки новой ширины и высоты UITextView
, и даже если текст просматривает влево/вправо, текст обертывается, как если бы ширина была только шириной экрана.
Спасибо
self.responceTextView.text = [NSString stringWithFormat:@"%@%@",_responceTextView.text,responce];
[self textViewDidChange:self.responceTextView];
- (void)textViewDidChange:(UITextView *)textView
{
// Recalculate size of text field
CGSize maxSize = CGSizeMake(MAXFLOAT, MAXFLOAT);
CGSize reqSize = [textView.text sizeWithFont:[UIFont fontWithName:@"Courier" size:12] constrainedToSize:maxSize lineBreakMode:NSLineBreakByClipping];
self.responceTextView.frame = CGRectMake(0, 0, reqSize.width+16, reqSize.height+16);
// Resize scroll view if needs to be smaller so text stays at top of screen
CGFloat maxScrollHeight = maxScrollViewSize.size.height;
if (self.responceTextView.frame.size.height < maxScrollHeight) {
self.responceScrollView.frame = CGRectMake(self.responceScrollView.frame.origin.x, self.responceScrollView.frame.origin.y, self.responceScrollView.frame.size.width, self.responceTextView.frame.size.height);
} else {
self.responceScrollView.frame = maxScrollViewSize;
}
// Set content size
self.responceScrollView.contentSize = CGSizeMake(self.responceTextView.frame.size.width, self.responceTextView.frame.size.height);
[self scrollToCursor];
}
РЕДАКТИРОВАТЬ ----
Итак, кажется, что sizeWithFont
устарел в iOS 7. Странно, как я не получаю предупреждения о компиляторе.
По-прежнему не имеет смысла, что он не работает на iOS 6 (или он полностью удален при построении с помощью iOS 7 SDK?)
Я пробовал эти 2 альтернативы, но получаю точно такой же размер от всех.
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIFont fontWithName:@"Courier" size:12], NSFontAttributeName,
nil];
CGRect rect = [textView.text boundingRectWithSize:maxSize options:NSLineBreakByClipping | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil];
возвращает: {{0, 0}, {439.27148, 168}}
CGSize rect2 = [textView.text sizeWithAttributes:attributes];
возвращает: {439.27148, 168}
И в приведенном выше оригинале возвращается {439.27148, 168}
Все они должны вернуться к более широкому представлению.
ИЗМЕНИТЬ 2 ----
Похоже, что вернувшийся фрейм правильный (439 широкий), однако текст, который все еще является словом, завернутым в текстовое окно.
Ответы
Ответ 1
попробуйте использовать:
[textView.text boundingRectWithSize:CGSizeMake(txtFrame.size.width, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
attributes:[NSDictionary dictionaryWithObjectsAndKeys:textView.font,NSFontAttributeName, nil] context:nil];
Измерение строки кажется довольно неудачным. Это единственная комбинация параметров, которая дает правильный размер для тестирования, которое я сделал.
Я использую следующий код с успехом в iOS7 (это a UITextField
с минимальной и максимальной высотой. Когда высота текста становится больше, чем MAX_HEIGHT_MESSAGE_TEXTBOX
, полосы прокрутки появляются в 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 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 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];
}
ИЗМЕНИТЬ
Когда измерение строки правильное, вам может потребоваться изменить lineBreakMode
в текстовом контейнере UITextView
. (NSTextContainer
- новый класс в iOS7, содержащий информацию о том, как текст должен быть выложен):
textView.textContainer.lineBreakMode = NSLineBreakByCharWrapping; // default is NSLineBreakByWordWrapping
Удачи!
Ответ 2
метод sizeWithFont:(UIFont *)font constrainedToSize ..."
устарел в iOS 7.
Он будет функционировать должным образом.
Проверьте его альтернативу в iOS 7
Метод экземпляра NSString
-(CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:
(NSDictionary *)attributes context:(NSStringDrawingContext *)context
Отметьте этот ответ.
Замена для устаревшего размераWithFont: в iOS 7?
Ответ 3
Я думаю, вы хотите рассчитать размер контента, чтобы увеличить размер содержимого прокрутки. если да Используйте эту ссылку, fooobar.com/questions/542562/...
Ответ 4
для ответа на "Спасибо, но это, похоже, не касается моей проблемы. Я использую как гибкую ширину, так и высоту. Кажется, я получаю правильные размеры, возвращенные, поскольку текстовые прокрутки достаточно в обоих направлениях, однако сам текст по-прежнему переносится на слово.
Я исправил это с помощью [textView sizeToFit];