2014-10-09 2 views
6

Я хотел бы использовать UISitDynamics UISnapBehaviour, чтобы оживить анимацию (внешний вид + изменение положения при повороте) кнопки, которая сама позиционируется в режиме просмотра с помощью автоматической компоновки.Анимированный автоматический макет с использованием UIKitDynamics

Я понимаю, что, применяя силы UIKitDynamics, мне нужно временно отключить ограничения автоматической компоновки с кнопки. Я имею в виду следующий процесс ...

  1. Получить целевой центр/окаймляет кнопки перед тем на основе перехода Auto Layout происходит (но после того, как он запускается). Сохраните это значение.
  2. Временно отключить все Auto Layout/ограничения кнопки
  3. Нанести UISnapBehaviour. Подайте его с сохраненным целевым центром или значением границ из автоматического макета (с шага 1).
  4. Когда анимация UIKitDynamics закончена повторное включение ограничений для подготовки любых последующих изменений макета

Является ли это правильный подход?

Какого делегата/макет должен использоваться для тех, кто эти соответствующих шагов +, как я могу получить целевого центр на вид из Автокомпоновка перед тем фактического Auto Layout основы анимации/переход происходит?

+2

На самом деле вам не нужно отключать ограничения для представления, чтобы использовать UIKitDynamics с автоматической компоновкой. Существует некорректный трюк, который кто-то показал мне некоторое время назад, что если вы создаете пользовательский NSObject, чем соответствует , добавьте поведение к этому настраиваемому элементу и затем измените ограничения в блоке действий поведения. – DBoyer

+1

Это правильный ответ, анимируйте ограничения, а не кадр. – Gusutafu

ответ

2

Я мог бы предложить другой подход, который приближается к UISnapBehavior, но избегает попытки выйти замуж за UIKit Dynamics с автоматической компоновкой, где вы полагаетесь на механизм автоматического макета, чтобы определить конечную позицию представления. (Очевидно, что если бы вы знали конечный пункт назначения, тогда вы просто приостановили автоматическую компоновку, привязку, и когда бы это было сделано, вы применили бы ограничения.)

Для эффекта подпрыгивания при просмотре изображения место, вы можете использовать animateWithDuration с usingSpringWithDamping параметр, например:

// create the view 

UIView *view = ...; 
view.translatesAutoresizingMaskIntoConstraints = NO; 
[self.view addSubview:view]; 

// add all of the constraints for the final position 

NSDictionary *views = NSDictionaryOfVariableBindings(view); 
[self.view addConstraints:...]; 

// animate the application of those constraints with low `withSpringWithDamping` 

[UIView animateWithDuration:1.0 delay:0.0 usingSpringWithDamping:0.5 initialSpringVelocity:0.0 options:0 animations:^{ 
    [view layoutIfNeeded]; 
} completion:nil]; 

Если вы хотите некоторое вращение, как он встанет на место, вы можете использовать animateKeyframesWithDuration:

[UIView animateKeyframesWithDuration:1.0 delay:0.0 options:0 animations:^{ 
    [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.5 animations:^{ 
     view.transform = CGAffineTransformMakeRotation(M_PI_4/2); 
    }]; 
    [UIView addKeyframeWithRelativeStartTime:0.5 relativeDuration:0.25 animations:^{ 
     view.transform = CGAffineTransformMakeRotation(-M_PI_4/4); 
    }]; 
    [UIView addKeyframeWithRelativeStartTime:0.75 relativeDuration:0.125 animations:^{ 
     view.transform = CGAffineTransformMakeRotation(M_PI_4/16); 
    }]; 
    [UIView addKeyframeWithRelativeStartTime:0.875 relativeDuration:0.125 animations:^{ 
     view.transform = CGAffineTransformMakeRotation(0); 
    }]; 
} completion:nil]; 

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