Переход UIViewWithView: отсечение моего UITextView

У меня есть UITextView с отключенной прокруткой, и я использую переход скручивания страницы, чтобы изменить текст внутри. Это код, который я использую:

myView.text = nextString;

[UIView transitionWithView:myView duration:PAGE_CURL_DURATION options:UIViewAnimationOptionTransitionCurlDown animations:nil completion:nil];

Все работает нормально, за исключением того, что если в новой текстовой строке больше строк, чем в старой, она будет обрезана до завершения анимации. Похоже, что contentSize меняется ПОСЛЕ анимации. Я пытался добавить myView.contentSize = myView.bounds.size;, но это ничего не изменило. Я также отключил «подзаголовки клипов» безрезультатно.

Вот как это выглядит сразу после анимации: альтернативный текст

через мгновение текст больше не обрезается.

Любые идеи, как предотвратить отсечение?


person Kenny Winker    schedule 20.07.2010    source источник
comment
Все еще ищете решение по этому вопросу ... предложения о том, что можно попробовать, приветствуются!   -  person Kenny Winker    schedule 24.07.2010
comment
НАШЕЛ РЕШЕНИЕ (только спустя полтора месяца). UIViewAnimationOptionAllowAnimatedContent Бу-да!   -  person Kenny Winker    schedule 05.09.2010


Ответы (3)


Самый простой способ — сделать то, что сказал Бьярн, — использовать свойство clipsToBounds. Но будьте осторожны - это заставит текст бесконечно расширяться вниз. Таким образом, вам также нужно будет окружить текстовое поле представлением контейнера, которое ДЕЙСТВИТЕЛЬНО обрезает границы, чтобы установить верхний предел.

Если это не поможет, вам придется проделать некоторую работу, чтобы вручную расширить границы вашего текстового представления и изменить его положение перед анимацией, если новый текст больше.

Чтобы получить размер текста, проверьте UIStringDrawing.h в среде UIKit. В частности, я думаю об использовании: - (CGSize) sizeWithFont: (UIFont *) font forWidth: (CGFloat) width lineBreakMode: (UILineBreakMode) lineBreakMode; вместе с UILineBreakModeWordWrap.

другой альтернативой получению размера может быть эта функция в UILabel: - (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines; и переход в границы максимально возможного текстового представления.

Для получения дополнительной оценки вы также можете рассмотреть возможность анимации изменения границ вашего представления для более плавного перехода.

person Rolf Hendriks    schedule 30.07.2010
comment
это казалось, что это собиралось исправить это, но это не так. UIViewAnimationOptionAllowAnimatedContent сделал. Еще хороший совет! Спасибо за советы! - person Kenny Winker; 05.09.2010

Это довольно странно. contentSize не должен обрезать содержимое, а только определять поведение прокрутки. Однако это единственное, что меняется от пре-анимации к пост-анимации. И у меня всегда работало снятие флажка с Clip Subviews.

Несколько вариантов:

Я предполагаю, что ваш UITextView.frame достаточно велик, чтобы изначально содержать самый большой из обоих текстов? Если вы установите его непосредственно перед запуском анимации, вы можете опоздать. В таких случаях такие приемы, как [self performSelector(continueWithStuff:) withObject:object afterDelay:0.01], творят чудеса, потому что вы даете пользовательскому интерфейсу время, необходимое для осуществления ваших изменений, прежде чем анимация определит начальное состояние.

Но самым простым решением будет добавить несколько новых строк в каждый текст. Поскольку вы все равно не прокручиваете, это не должно быть проблемой.

Другим способом может быть встраивание вашего UITextView в UIView, который вы затем анимируете. При чтении документации аргумент view должен быть "представление контейнера, содержащее представления, участвующие в переходе". Игнорирование этого факта может привести к удивительным результатам.

person mvds    schedule 26.07.2010
comment
Для записи: UIViewAnimationOptionAllowAnimatedContent разрешил UITextView обновляться во время анимации, устраняя проблему отсечения. - person Kenny Winker; 05.09.2010

Самый простой способ решить вашу проблему — установить для свойства UITextView «clipsToBounds» значение NO. Это сделает ваше текстовое представление доступным для рисования за его пределами.

person Bjarne Mogstad    schedule 28.07.2010
comment
Это не было проблемой отсечения вида до границ, вместо этого он просто не обновлялся во время анимации. UIViewAnimationOptionAllowAnimatedContent исправил это. - person Kenny Winker; 05.09.2010