2013-09-26 4 views
0

Я обновляю свое приложение с iOS6 до iOS7, и у меня возникают некоторые проблемы с макетом UIViewControllers. В iOS6 я смог динамически изменять размер моего UITextViews, получив свойство contentSize textView, а затем установив его свойство frame. Я бы сделал все изменения размера в методе viewWillAppear таким образом, чтобы вид был изменен до того, как он был виден. Теперь в iOS7 он не работает. Единственный способ, которым работает свойство contentSize, - это установить метод viewDidAppear. Я ненавижу это, потому что он заставляет просмотр прыгать после того, как он уже виден. Кто-нибудь понял, как решить эту проблему?IOS7 получить UITextView contentSize перед представлением методаDidAppear?

Вот мой код, который больше не работает в iOS7:

-(void)viewWillAppear:(BOOL)animated 
{ 
    self.textView = [[UITextView alloc]initWithFrame:CGRectMake(5, 0, 310, 0)]; 
    self.textView.text = @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, 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.view addSubview:self.textView]; 

    CGRect textViewframe; 
    textViewframe = self.textView.frame; 
    textViewframe.size.height = [self.textView contentSize].height; 
    self.textView.frame = textViewframe; 
} 
+1

просто напишите этот код в видеDidLoad, а затем посмотрите, что происходит –

+0

viewDidLoad вызывается перед просмотромWillAppear и не будет работать. Я ищу решение до вызова 'viewDidAppear'. – DJSK

+0

Как насчет 'viewWillLayoutSubviews'? –

ответ

10

Вы можете позвонить [self.textView layoutIfNeeded] после создания его с соответствующей рамкой (чтобы он мог определить его максимальную ширину), тогда contentSize должен представлять содержимое.

Кроме того: если textView определяется как weak, текстовое представление исчезнет на следующей строке (поскольку ARC добавляет релиз, а оптимизатор перемещает его). Они объявили об этом изменении оптимизации для отладки (-O0) во время WWDC.

+0

Спасибо, но это не сработало. Я уверен, что это ошибка в iOS7, которую нужно исправить. – DJSK

+0

Единственное, что осталось проверить, это определение self.textView .. –

+0

Но это не будет первая ошибка iOS 7 :( –

0

У нас такая же проблема с видом таблицы. Что еще хуже, так это то, что переход на более поздний вызов жизненного цикла, такой как ViewDidAppear, может ухудшить работу пользователя (с точки зрения производительности). Мы пытаемся разбить код и сделать только размер содержимого в ViewWillAppear. Но проблемы пользовательского интерфейса остаются.

1

Я встретил аналогичную ситуацию, как ур. Mine показывает с другой ошибкой, но по той же причине: свойство contentSize тихо изменяется iOS7 неправильно. Вот как я обхожу это. Это своего рода уродливое решение. Всякий раз, когда мне нужно использовать textView.contentSize, я вычисляю его сам.

-(CGSize)sizeOfText:(NSString *)textToMesure widthOfTextView:(CGFloat)width withFont:(UIFont*)font 
{ 
    CGSize size = [textToMesure sizeWithFont:font constrainedToSize:CGSizeMake(width-20.0, FLT_MAX) lineBreakMode:NSLineBreakByWordWrapping]; 
    return size; 
} 

, то вы можете просто вызвать эту функцию, чтобы получить размер:

CGSize cont_size = [self sizeOfText:self.text widthOfTextView:self.frame.size.width withFont:[UIFont systemFontOfSize:15]]; 

тогда, не делайте следующее:

self.contentSize = cont_size;// it causes iOS halt occasionally. 

так, просто используйте cont_size непосредственно. Я считаю, что это ошибка в iOS7. Надеюсь, яблоко скоро исправит. Надеюсь, это полезно.

+0

Спасибо. Я попробовал аналогичную формулу, подобную вашей, с аналогичными результатами. Я заметил, что когда я зарегистрировал cont_size.height в viewWillAppear, а затем сравнил его с тем, что contentSize.height будет в методе viewDidAppear, я получил несколько разные результаты. В зависимости от того, какие шрифты и размеры рамы были использованы, он обычно отключается примерно на 4-6 пунктов (и некоторые изменения). Наверное, я буду использовать это пока, пока Apple не решит проблему. – DJSK

+0

'sizeWithFont' лишен iOS7 –

0

Имея эту проблему с UITextView, и я не могу зависеть от contentSize, давая правильное значение для изменения размера моего textView, а также не вызывает вызов layoutIfNeeded в textView, чтобы получить правильное значение для меня. Поэтому, чтобы решить эту проблему, я использую sizeThatFits вместо sizeWithFont для определения UITextView contentSize. SizeWithFont имеет некоторые тонкие отличия и sizeThatFits более подходит для использования в UITextViews, см. UITableViewCell with UITextView height in iOS 7?.

Так что мое решение выглядит так:

UITextView* sizingView  = [[UITextView alloc] initWithFrame:textView.frame]; 
sizingView.attributedText = textView.attributedText; 
CGSize contentSize   = [sizingView sizeThatFits:CGSizeMake(sizingView.frame.size.width, FLT_MAX)]; 

Если вы заметите, я создаю новый UITextView, скопируйте приписываемый текст и получить размер контента там, потому что, к сожалению, sizeThatFits имеют некоторые неприятные побочные эффекты, может привести к тому, что textView не будет корректно обновляться в iOS 7.0.

+0

Хмм .... layoutIfNeeded должен работать. и запустил результаты и все, что соответствовало. Мне любопытно, почему это не сработает для вас. Как вы его реализовали? – DJSK

+0

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

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