私のゲームでは、メインのUIViewでホストされている小さなUIViewのグリッドがあります。ランダムにボックスが異なる色に変わります。この時点で、ユーザーはボックスに触れてポイントを獲得できます。彼らがボックスに触れたとき、私はある種のアニメーション、理想的にはXCodeがネイティブに提供するモーダル水平フリップセグエに似たものを表示したいと思います。実際に別のUIViewに移行せずに、このアニメーションを実行するにはどうすればよいですか?
5 に答える
次のように、ビュー変換を簡単に試してアニメーション化できます(垂直反転の場合)。
[UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut
animations:^(void) {
view.transform = CGAffineTransformMakeScale(1, -1);
}
completion:nil];
または、より適切に制御するために、 iOS-Flip-Transformを調べることができます。
編集:
影のことについては、これを試してください:
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をインポートすることを忘れないでください。
UIViewはと呼ばれるメソッドを提供します
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion
オプションには、UIViewAnimationOptionTransitionFlipFromLeft
および...が含まれます。Right
反転する必要のあるボックスごとに、コンテナ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];
}
これは、Swift3.0の次のコードで実行できます。
UIView.animate(withDuration: 0.5, delay: 0.0, options: .curveEaseInOut, animations: {
self.view.transform = CGAffineTransform(scaleX: 1, y: -1)
}, completion: nil)
このアクションはメインスレッドで発生するため、実行中にアプリがブロックされることに注意してください。
完了ハンドラーが必要な場合は、いくつかのオプションがあります
これは、 Ilker Baltaciの回答に基づいて( Swift 3で)私が最終的に得たものです:
@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)
}
containerView
、view1
&view2
(すべてカスタムViewControllerクラスにあります)のビュー階層IBOutlets
は次のとおりです。
containerView
view1
view2