UIView Изменение размера анимации глюков - PullRequest
2 голосов
/ 08 июля 2011

Я боролся с, казалось бы, незначительным затруднением в том, как оживляет мой подкласс UIView. Я настроил вид так:

self.contentMode = UIViewContentModeRedraw;
self.contentStretch = CGRectMake(0.5f, 0.5f, 0.0f, 0.0f);

Вид - это в основном прямоугольник с 3-х пиксельным штрихом. Поскольку я хочу, чтобы представление не искажалось при изменении размера, у меня есть свойство contentStretch, указывающее середину представления. Проблема в том, что искажение происходит во время роста, но при уменьшении оно плавное.

Похоже, мой анимационный блок довольно прост; У меня есть отдельные для роста и сокращения. Вот растущий блок:

[UIView animateWithDuration:0.5 animations:^{
    CGRect newRect = CGRectMake(20, 100, 200, 70);
    [titleView setFrame:newRect];
}];

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

http://dl.dropbox.com/u/2798577/ViewResizeTest2.0.zip

Вы можете видеть, когда вы нажимаете кнопку «Расти», левая сторона представления «глюкает» перед анимацией. Несмотря на то, что здесь это хорошо видно, в моем реальном проекте это немного хуже.

Я не уверен, что это ошибка в моем коде или проблема с фреймворком? Надеюсь, что это бывший ...

Спасибо, Аарон.

Обновление Получив щедрую обратную связь Джейкоба, я вернулся к своему приложению и удалил параметр contentMode как UIViewContentModeRedraw, отметив при этом, что он будет запускать drawRect каждый раз, когда анимирует, и, возможно, этот начальный кадр является частью сбоя. Так что теперь анимация плавная, но она анимируется в неправильную позицию, расплющивая стороны. Я обновил связанный проект, чтобы он более точно отражал то, что происходит в моем приложении.

Если бы мне пришлось угадывать, казалось бы, свойство contentStretch не выполняет свою работу. Это изменяет размер всего объекта, а не области CGRect внутри, согласно моей инструкции. Кто-нибудь может подтвердить, правильно ли я это использую?

Ответы [ 2 ]

2 голосов
/ 17 июля 2011

Я понял это сейчас; Вот ответ для всех, кто сталкивается с этой проблемой.

Документация для свойства contentStretch в UIView не содержит полной информации. В моем случае я понял цель contentStretch - описать «образец» области, размер которой должен быть изменен. Вместо этого contentStretch должен описывать весь регион, размер которого будет изменен. Сейчас, когда я пишу это, это имеет смысл, но для меня это было неочевидно.

Поэтому мое оригинальное объявление:

self.contentStretch = CGRectMake(0.5f, 0.5f, 0.0f, 0.0f);

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

self.contentStretch = CGRectMake(0.2, 0, 0.7, 1);

Обратите внимание, что это прямоугольник, который начинается на 20% по оси x и охватывает 70% ширины на полной высоте. В тех размерах, которые должны были быть у моего прямоугольника, это было красиво.

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

Ура, Аарон.

1 голос
/ 10 июля 2011

Избавьтесь от следующей строки в TitleView.m:

self.contentMode = UIViewContentModeRedraw;

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

По умолчанию contentMode - UIViewContentModeScaleToFill, что вам и нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...