2014-01-23 9 views
4

У меня есть два UIViews (Мой плохой - UIView и UIButton), которые я анимирую в то же время. Первоначально у меня был вид и контейнер, который бы оживлял просто отлично и работал как шарм.UIView не меняет позицию в animateWithDuration

Теперь только один из моих UIViews будет перемещаться/анимировать в animateWithDuration, даже если через отладку кадр другого представления говорит, что он находится в положении, которого нет.

CGRect rect = self.toggle.frame; 
    CGRect tabRect = self.tabButton.frame; 
    rect.origin.x = rect.origin.x - rect.size.width; 
    NSLog(@"%f Before",tabRect.origin.x); 
    tabRect.origin.x = tabRect.origin.x - rect.size.width; 
    NSLog(@"%f After", tabRect.origin.x); 
    [UIView animateWithDuration:0.3 animations:^{ // animate the following: 
     self.toggle.frame = rect; // move to new location 
     self.tabButton.frame = tabRect; 
    }]; 
    NSLog(@"%f AfterAnimation", tabButton.frame.origin.x); 

Вид тумблер движется нормально, но tabButton вид не одушевленный или двигаться. Странно, что оба кода отладки «After» и «AfterAnimation» возвращают одинаковое значение, что предполагает, что кадр действительно переместился. Есть ли определенная причина, по которой это не будет работать, если toggle является UIView, когда он будет работать как UIContainerView?

Обратите внимание, что если я удалить строку

self.toggle.frame = rect; 

tabButton оживит правильно, но если я перееду toggle, tabButton не будет двигаться независимо от того, является ли он первым в блоке анимации или второй.

Редактировать: Я попытался переместить их в отдельные блоки и изменить центральную точку, а не рамку, но безрезультатно. Кажется, что если вид toggle перемещается, то tabButton не будет двигаться.

Edit 2:. Иллюстрированное свидетельство {

На следующих скриншотах tabButton Б.Г. зеленый и переключение Б.Г. красный.

Initial position (<code>toggle</code> is off-screen) correct position

Выше: Исходное положение (toggle выключен экран) правильное положение

The problem in question <code>toggle</code> is correct <code>tabButton</code> is not

Выше: Проблема в вопросе toggle правильно tabButton не

When <code>self.toggle.frame = rect</code> is commented out (<code>tabButton</code> correct, <code>toggle</code> not)

Вверху: Когда self.toggle.frame = rect закомментирована (tabButton правильно, toggle нет) }

Edit 3:. Это даже хуже, чем я опасался {

Я сделал еще несколько тестов, и даже если я беру toggle измените из блока анимации, чтобы сделать его мгновенным, tabButton будет еще не анимировать. Это заставляет меня думать, что tabButton может просто принципиально не любить вид toggle и/или меня, так что я не буду двигаться, чтобы на меня наброситься.

}

Редактировать 4: {

Если изменить tabButton анимацию tabButton.frame = CGRectMake(10,10,100,100) The View защелкивается сразу к этому месту и оживляет обратно в исходное положение в то же время, что и продолжительность анимации.

}

Я лучше добавить больше бухгалтерское/информацию TLDR в случае, если вещи не ясны.

  • toggle является экземпляром ToggleDraw, который является подтаблица из UIView, который я создал.

  • tabButton является UIButton, которая является частью моей IB ViewController и свойство класса

  • Оба toggle и tabButton являются подвиды из self.view

  • анимаций будет работать в индивидуальном порядке без каких-либо изменений к логика прямых, но не будет работать, если они будут анимированы в то же время

  • toggle анимация, похоже, воспринимается pr ecedence над tabButton анимации, независимо от того,

+0

Как по крайней мере временный хак, что произойдет, если вы поместите их в отдельные блоки? – nhgrif

+0

По-прежнему не будет работать, если линия переключения не закомментирована –

+0

Интересно. Можете ли вы проверить две кнопки для каких-либо различий в их свойствах? – nhgrif

ответ

0

Я думаю, что это не проблема о UIView анимации. Возможно, ваша позиция переключения связана с вашим tabButton. Попробуйте, вы можете установить рамку переключения в прямую лижу (10, 10, 100, 100), а затем проверить результат.

+0

Я пробовал это, анимация существенно пошла в обратном направлении, без всякой причины, в частности –

+0

в subviews toggle contian tabButton? – simalone

+0

Нет, взгляды братья и сестры. Оба являются subViews self.view –

0

Я создал пример того, что вы описали, и все работает нормально. Это то, что я использовал:

UIView *toggle = [[UIView alloc] initWithFrame:CGRectMake(320, 64, 100, 100)]; 
[toggle setBackgroundColor:[UIColor redColor]]; 
[self.view addSubview:toggle]; 

UIButton *tabButton = [[UIButton alloc] initWithFrame:CGRectMake(220, 64, 100, 100)]; 
[tabButton setBackgroundColor:[UIColor greenColor]]; 
[self.view addSubview:tabButton]; 

CGRect rect = toggle.frame; 
CGRect tabRect = tabButton.frame; 
rect.origin.x = rect.origin.x - rect.size.width; 
NSLog(@"%f Before",tabRect.origin.x); 
tabRect.origin.x = tabRect.origin.x - rect.size.width; 
NSLog(@"%f After", tabRect.origin.x); 
[UIView animateWithDuration:1 animations:^{ // animate the following: 
    toggle.frame = rect; // move to new location 
    tabButton.frame = tabRect; 
}]; 

Что я могу предложить, чтобы убедиться, что код в настоящее время работал на mainthread:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [UIView animateWithDuration:0.3 animations:^{ 
     self.toggle.frame = rect; // move to new location 
     self.tabButton.frame = tabRect; 
    }]; 
}); 

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

Если вы хотите запускать код после анимации вы должны использовать:

[UIView animateWithDuration:0.3 animations:^{ 
    self.toggle.frame = rect; // move to new location 
    self.tabButton.frame = tabRect; 
} completion:^(BOOL finished){ 
    NSLog(@"Finished animating!"); 
}]; 
+0

Это с 'tabButton' является' UIButton' и 'toggle' является' UIView'? Я помещал представление в тот же Rect, что и tabButton, и представление перемещалось просто отлично. –

+0

Я только что отредактировал, добавив, что я использовал для тестирования. Все работает нормально. Обычно, когда я испытываю это странное поведение анимации, он почти всегда связан с тем, что код выполняется на фоновом потоке, а не на главном. – manecosta

0

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

Это похоже на то, что мне очень нравится hacky Мне нравится, как надевать бандаж на отсутствующую ногу и надеяться, что он будет разбираться. Я не мог решить причину проблемы, но по крайней мере я мог избежать симптомов.

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

Спасибо за вашу помощь.

+0

Вопрос: Вы используете UIDynamicAnimator еще где? – AppHandwerker

+0

Нет, это была единственная анимация в то время –

3

У меня возникла проблема с анимацией UIView, созданной в IB (анимация не начиналась с текущей позиции представления и заканчивалась в исходной позиции).

Все работало отлично после отправки layoutIfNeeded() в подстилающей зрения перед блоком анимации:

self.view.layoutIfNeeded() 
UIView.animateWithDuration(0.5) {() -> Void in 
... 
+0

Она работала лучше всего для меня, если я положил ее в блок анимации в Swift 2.1 – Nathaniel

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