Анимация анимации UIView
В моей игре у меня есть сетка меньших UIView, размещенных на моем основном UIView. В случайном порядке коробки будут отличаться от цвета, и в этот момент пользователь может коснуться их, чтобы набрать очки. Когда они касаются коробки, я хочу показать какую-то анимацию, в идеале что-то похожее на модальный горизонтальный щелчок, который XCode предлагает изначально. Как я могу сделать эту анимацию без фактического перехода в другой UIView?
Ответы
Ответ 1
Вы можете просто попробовать и оживить преобразование вида, как это (для вертикального флип):
[UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut
animations:^(void) {
view.transform = CGAffineTransformMakeScale(1, -1);
}
completion:nil];
или для лучшего контроля вы могли бы взглянуть на iOS-Flip-Transform.
EDIT:
для теневой вещи, попробуйте следующее:
view.layer.shadowColor = [UIColor blackColor].CGColor;
view.layer.shadowOpacity = 0.75;
view.layer.shadowRadius = 15.0;
view.layer.shadowOffset = (CGSize){0.0,20.0};
[UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut
animations:^(void) {
view.transform = CGAffineTransformMakeScale(1, -1);
}
completion:^(BOOL b) {
view.layer.shadowColor = [UIColor clearColor].CGColor;
view.layer.shadowOpacity = 0.0;
view.layer.shadowRadius = 0.0;
view.layer.shadowOffset = (CGSize){0.0, 0.0};
}];
Надеюсь, это сработает для вас. Вы можете изменить настройки тени по своему усмотрению. Не забудьте импортировать QuartzCore/QuartzCore.h.
Ответ 2
UIView предоставляет метод под названием
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion
Параметры включают UIViewAnimationOptionTransitionFlipFromLeft
и... Right
Ответ 3
Для каждого поля, которое нужно перевернуть, вы можете использовать контейнер UIView.
Добавьте обе стороны в этот контейнер.
if(side1Visible)
UIViewAnimationOptions options = UIViewAnimationOptionBeginFromCurrentState |
UIViewAnimationTransitionFlipFromRight;
[UIView transitionWithView:containerView
duration:1.0
options:options
animations:^{ side1.hidden = YES; side2.hidden = NO; }
completion:NULL];
else{
UIViewAnimationOptions options = UIViewAnimationOptionBeginFromCurrentState |
UIViewAnimationTransitionFlipFromLeft;
[UIView transitionWithView:containerView
duration:1.0
options:options
animations:^{ side1.hidden = NO; side2.hidden = YES; }
completion:NULL];
}
Ответ 4
Вы можете сделать это со следующим кодом для Swift 3.0:
UIView.animate(withDuration: 0.5, delay: 0.0, options: .curveEaseInOut, animations: {
self.view.transform = CGAffineTransform(scaleX: 1, y: -1)
}, completion: nil)
Просто имейте в виду, что это действие будет происходить в вашем основном потоке, поэтому приложение будет заблокировано во время выполнения.
Если вам нужен обработчик завершения, существует несколько вариантов
Ответ 5
Это то, с чем я столкнулся (в Swift 3) на основе Ответ Ilker Baltaci:
@IBAction func flipViews() {
// declare variables for transition
let duration = 0.5
var animationOptions: UIViewAnimationOptions
var animations: () -> Void
var completion: ((Bool) -> Void)?
if view2.isHidden {
animationOptions = [.beginFromCurrentState, .transitionFlipFromTop]
animations = {
self.view2.isHidden = false
self.view1.isHidden = true
}
completion = { success in
if success {
self.updateSomeContentOfView2()
}
}
} else {
animationOptions = [.beginFromCurrentState, .transitionFlipFromBottom]
animations = {
self.view2.isHidden = true
self.view1.isHidden = false
}
}
UIView.transition(with: containerView,
duration: duration,
options: animationOptions,
animations: animations,
completion: completion)
}
Иерархия My View для containerView
, view1
и view2
(всех IBOutlets
в моем классе ViewController) выглядит следующим образом: