質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

3回答

584閲覧

Swift3 アニメーションについて

shi_o

総合スコア53

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/07/18 13:28

編集2017/07/19 03:39

###前提・実現したいこと
UIImageViewをY座標を軸にして回転させたい。

###発生している問題・エラーメッセージ
UIImageViewが回転の際に半分だけ表示になってしまう。
ちゃんと1回転しているのかわからない。

※半分というのは右半分、左半分しか表示されないということ。
※Imageviewは大きなImageviewの上に重なるようにして小さいImageviewを配置しています。小さいほうがアニメーションをするほうです。
###該当のソースコード

@IBOutlet weak var imageview: UIImageView!
var imageA = UIImage()

override func viewDidLoad() {
super.viewDidLoad()

imageA = UIImage(named: "name")! imageview.image = imageA

}

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)

let rotateAnimation = CABasicAnimation(keyPath: "transform") rotateAnimation.duration = 0.5 rotateAnimation.repeatCount = 1 rotateAnimation.autoreverses = true rotateAnimation.isCumulative = true let transform = CATransform3DMakeRotation(CGFloat(M_PI), 0, 1.0, 0) rotateAnimation.toValue = NSValue(caTransform3D : transform) imageview.layer.add(rotateAnimation, forKey: nil)

}

###補足情報(言語/FW/ツール等のバージョンなど)
Swift3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/07/19 00:18

半分というのは裏側が表示されないということでしょうか?
shi_o

2017/07/19 02:15

表側も裏側も正方形のimageviewが左半分や右半分しか表示されないです。
fuzzball

2017/07/19 02:45

コードをコピペして試してみましたが正しく表示されました。画像もしくはStoryboardの設定などに問題があると思われますので、その辺りの情報を書いて下さい。
shi_o

2017/07/19 03:37 編集

UIView全体を覆うようにimageviewを配置して、その上にまた正方形のimageviewを配置しています。私もいろいろ調べましたがimageviewが重なっている状態の場合、アニメーションをするとimageviewが隠れてしまうらしいです。それが原因でしょうか?
guest

回答3

0

ベストアンサー

imageviewが重なっている状態の場合、アニメーションをするとimageviewが隠れてしまうらしいです

UIImageViewに限った話ではありません。
背面Viewが透明でない限り、前面Viewの後ろに回った部分は背面Viewに隠れてしまいますので、半分しか見えないという状況になっています。

解決方法1

CALayerのzPositionを使う。

swift

1imageview.layer.zPosition = imageview.frame.width/2

垂直になった時の奥行き(View幅の半分)だけ手前に移動させています。(移動量に関してあまり自信なし。うまくいっているようなので間違ってない?)

解決方法2

階層を分ける。

View | +-- 背面ImageView | +-- 前面ImageView

階層が違えば、回転させても隠れることはありません。
ただし、Storyboard上ではUIImageViewの上にViewを乗せることが出来ませんので、コードでaddSubviewして下さい。(無理やり乗せる方法もあるにはありますが‥)

投稿2017/07/19 04:38

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shi_o

2017/07/19 12:29

ご回答ありがとうございます。 imageview.layer.zPosition = imageview.frame.width/2 を追記したら狙い通りアニメーションしました。 ちなみにフェードインで表示され最初は早く回りだんだん遅くなって最後は止まるようにアニメーションするにはどうすればよろしいでしょうか? 何度も申し訳ありませんがよろしくお願いいたします。
guest

0

imageview.layer.zPosition = imageview.frame.width/2

を追記したら狙い通りにアニメーションしました。

投稿2017/07/19 12:26

shi_o

総合スコア53

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

duration を 2 とか大きい数字にすればゆっくりアニメーションし、きちんと回転できていることがわかります。

https://twitter.com/ykawashi7/status/887507043938058240

( Teratail にアニメーション GIF はアップロードできないみたいなので、 Twitter にアップロードしました)

UIImageView を重ねた場合は回転時に背景とした画像の裏に回っているため、動きとしては正しい。

背景の画像に隠れるアニメーション
https://twitter.com/ykawashi7/status/887528459982983168

背景の画像を半透明にしてわかりやすくしたアニメーション
https://twitter.com/ykawashi7/status/887529456339898369

投稿2017/07/18 13:44

編集2017/07/19 04:31
ykws

総合スコア1236

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shi_o

2017/07/18 14:17

durationの値を大きくしてもだめでした。 ゆっくり回っても画像は 半分のままです。。。
ykws

2017/07/19 03:02

回答にアニメーション GIF へのリンクを追加しました。このようにはならないですか?
shi_o

2017/07/19 03:42

なりませんでした… 質問に追記しましたが、大きなImageviewの上に重なるようにして小さいImageviewを配置しており、小さいほうがアニメーションをするほうです。 私も調べてみたのですが、Viewが重なる場合はアニメーションの際に上手く表示されないことがあるみたいです。
ykws

2017/07/19 04:34

画像を重ねた場合について追記しました。
shi_o

2017/07/19 12:30

わかりやすいご回答ありがとうございます。 解決しました。
ykws

2017/07/19 12:32

Good!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問