ラベル トランジション の投稿を表示しています。 すべての投稿を表示
ラベル トランジション の投稿を表示しています。 すべての投稿を表示

2019年9月26日木曜日

iOS13はモーダル画面表示が変更された


iOS13はモーダル画面を表示する際、全面を覆うのではなく上の一部に隙間を残し、指で下にスライドすると画面が閉じるような仕様になった。
これは強化されたマルチタスクを扱う際の変更じゃないかと思うんだが、デフォルトがこれなので、iOS13 & Xcode11であらためてビルドすると今までのアプリもそうなってしまうようで困る。

直し方は簡単で、vcに遷移先のViewControllerが入っているとすると、以下のようにプロパティ modalPresentationStyle に .fullScreen を指定するだけでいい。

vc.modalPresentationStyle = .fullScreen
self.present(vc, animated: true, completion: nil)

簡単はいいけど、これをデフォルトにしなくてもいいじゃねえかって思うんだけどね。よけいな作業増やしやがって。

2015年12月17日木曜日

画面遷移時のトランジションエフェクトで変なメッセージ出る

別画面をトランジションエフェクト付きで開こうと、次のコードを実行したら、毎度変なメッセージが出ちゃうですよ。
一応トランジションは実施される。(遷移前のviewの透明部分に先に遷移後のviewの画像が出ちゃうとか細かい不具合は見られるけど)

alienVC.modalTransitionStyle = UIModalTransitionStyle.FlipHorizontal
self.presentViewController(alienVC , animated: true, completion: nil)

遷移先の画面で
self.dismissViewControllerAnimated(true, completion: nil)
ってやって前の画面に戻る時にも同じメッセージが。

毎度出るメッセージ<_UIFlippingLayer: 0x14cf13c90> - changing property magnificationFilter in transform-only layer, will have no effect

和訳すると、
「トランスフォーム専用のレイヤーで拡大フィルターのプロパティーを変更しました。エフェクトできません」
とかそんな感じか?

これ、上みたいにコードで開く場合だけじゃなく、Segueで開く/戻る時にも出るんだよね。
UIFlippingLayerについてのメッセージだから、FlipHorizontalのエフェクトが関係するんだろうね?
UIModalTransitionStyle.FlipHorizontalを.CrossDissolveにすると出ない。
海外のサイト見たら、CATransformLayerでも同様のメッセージが出てるようで、「無視することがオススメ」なんて回答されてることも。
うざいっちゃうざいけど、よくわかんないし、大きな実害も出てないから当面無視するしかないか。

2015年10月16日金曜日

UIViewとかのトランジションアニメーション

画面上でImageViewとかをフェードイン/アウトとかさせる方法

その1:UIViewのアニメーション機能を使う

現在の状態からbeginAnimations()〜commitAnimations()の間に書かれた状態に変化させてくれるという、iOSではおなじみの方法。
最初にimageViewであるimage1のαチャネルの値(要するに透明度)を0(透明)にしておいて、setAnimationDurationで指定した時間(秒)をかけて、αチャネルの値を1(不透明)にする。
"fadeIn"はanimationIDということで、別の処理との識別に使うので、識別できればなんでもいいようだ。(この例では識別に使ってない)
setAnimationCurve()にアニメーションの進行速度の変化の指定もできる。ここでの.EaseOutはフェードインが速く始まりゆっくり終わる指定。

        image1.alpha = 0
        //フェードイン
        //アニメーションのタイプを指定
        UIView.beginAnimations("fadeIn", context: nil)
        //イージング指定
        UIView.setAnimationCurve(UIViewAnimationCurve.EaseOut)
        //アニメーション秒数を指定
        UIView.setAnimationDuration(2.0)
        //目標のアルファ値を指定
        image1.alpha = 1
        //アニメーション実行
        UIView.commitAnimations()

他にもsetAnimationDidStopSelector〜メソッドでアニメ実行終了後に呼ぶメソッドをSelectorとして指定できたりするようだ。
いろいろあるようなので、調べて使うよろし。

その2:QuartzCoreを使う

ついでに逆にフェードアウトも指定してみる。
その1のやり方でやってもいいんだけど、フェードアウトした直後にimage1をremoveFromSuperview()したところ、フェードアウトせずにさっさとimage1がremoveされてしまったので、別の方法を探したところでてきたのがこれ。
QuartzCoreFrameworkのインポートとかはプロジェクトの設定で必要なのかな。Objective-Cみたいにクラスごとにimportはいらないようだ。
beginAnimationsと違い、どこまでの範囲をアニメーションするとかはないようなので、必要であれば別メソッドに分けて実行させたほうがいいかも。さすがにメソッドの終わりで一区切りつくと思うので。

image1.alpha = 1
//フェードアウト
let transition = CATransition()
transition.duration = 2.0
transition.type = kCATransitionFade
view.layer.addAnimation(transition, forKey: nil)
image1.alpha = 0

なおこの場合、アニメーションが終わった後に
view.layer.removeAllAnimations()
としてアニメ設定を削除しておかないと、次回使う時に不具合を起こすことになるので注意だ。

その他のトランジションもパラメータを変えたりしてできるだろう。