質問編集履歴

4

コード追加

2015/06/03 08:02

投稿

taratail
taratail

スコア76

test CHANGED
File without changes
test CHANGED
@@ -17,3 +17,153 @@
17
17
  [https://www.youtube.com/watch?v=7Z9Myjx6xZg](https://www.youtube.com/watch?v=7Z9Myjx6xZg)
18
18
 
19
19
  このような処理をSpriteKitなどのフレームワークを使わずに実現したいです。ご教示いただけませんでしょうか。
20
+
21
+
22
+
23
+ **追記: 06/03**
24
+
25
+ 上のQiitaのリンクを参考に、手探りで書いております。以下のコードでタイマーによって1秒ごとにCAAnimationの動作・停止を繰り返す処理を書いてみました。一応、動作・停止は再現出来たものの、速度を変更しようにもlayer.speedを0.0または1.0以外の値にすると、手前のシミュレータで思うような動作をしません。引き続きより良い解決策をお教え願いたいです。
26
+
27
+
28
+
29
+ ```lang-swift
30
+
31
+ import UIKit
32
+
33
+ import QuartzCore
34
+
35
+
36
+
37
+ class ViewController: UIViewController {
38
+
39
+
40
+
41
+ var imageView: UIImageView!
42
+
43
+
44
+
45
+ override func viewDidLoad() {
46
+
47
+ super.viewDidLoad()
48
+
49
+
50
+
51
+ var animation = CAKeyframeAnimation(keyPath: "position")
52
+
53
+ animation.fillMode = kCAFillModeForwards
54
+
55
+ animation.removedOnCompletion = false
56
+
57
+ animation.speed = 0.05
58
+
59
+
60
+
61
+ var jumpHeight = CGFloat(80.0)
62
+
63
+ var curvedPath = CGPathCreateMutable()
64
+
65
+
66
+
67
+ let kStartPos = CGPoint(x: view.bounds.width/3, y: view.bounds.height/2)
68
+
69
+ let kEndPos = CGPoint(x: view.bounds.width*5/6, y: view.bounds.height*2/3)
70
+
71
+
72
+
73
+ CGPathMoveToPoint(curvedPath, nil, kStartPos.x, kStartPos.y)
74
+
75
+ CGPathAddCurveToPoint(curvedPath, nil, kStartPos.x + jumpHeight/2, kStartPos.y - jumpHeight,
76
+
77
+ kEndPos.x - jumpHeight/2, kStartPos.y - jumpHeight,
78
+
79
+ kEndPos.x, kEndPos.y);
80
+
81
+
82
+
83
+ animation.path = curvedPath
84
+
85
+ animation.removedOnCompletion = false
86
+
87
+ animation.fillMode = kCAFillModeForwards
88
+
89
+
90
+
91
+ imageView = UIImageView(frame: CGRectMake(kStartPos.x-25, kStartPos.y-40, 50, 80))
92
+
93
+ imageView.image = UIImage(named: "a")
94
+
95
+ view.addSubview(imageView)
96
+
97
+ imageView.layer.addAnimation(animation, forKey: nil)
98
+
99
+
100
+
101
+ NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "onUpdate:", userInfo: nil, repeats: true)
102
+
103
+
104
+
105
+ // アニメーション中の presentationLayer().position を layer.position として更新するためのタイマー
106
+
107
+ // これは無くても動きます。
108
+
109
+ NSTimer.scheduledTimerWithTimeInterval(1.0/30.0, target: self, selector: "onPositionUpdate:", userInfo: nil, repeats: true)
110
+
111
+ }
112
+
113
+
114
+
115
+ var flag = false // 1秒ごとに動作・停止を切り替えるためのフラグ
116
+
117
+
118
+
119
+ func onUpdate(timer : NSTimer) {
120
+
121
+
122
+
123
+ if !flag {
124
+
125
+ let pausedTime: CFTimeInterval = imageView.layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
126
+
127
+ imageView.layer.speed = 0.0
128
+
129
+ imageView.layer.beginTime = 0.0
130
+
131
+ imageView.layer.timeOffset = pausedTime
132
+
133
+ }
134
+
135
+ else {
136
+
137
+ let pausedTime: CFTimeInterval = imageView.layer.timeOffset
138
+
139
+ imageView.layer.speed = 1.0
140
+
141
+ imageView.layer.timeOffset = 0.0
142
+
143
+ imageView.layer.beginTime = 0.0
144
+
145
+ let timeSincePause: CFTimeInterval = imageView.layer.convertTime(CACurrentMediaTime(), fromLayer: nil) - pausedTime
146
+
147
+ imageView.layer.beginTime = timeSincePause
148
+
149
+ }
150
+
151
+ flag = !flag
152
+
153
+ }
154
+
155
+
156
+
157
+ func onPositionUpdate(timer : NSTimer) {
158
+
159
+ if !flag {
160
+
161
+ imageView.layer.position = imageView.layer.presentationLayer().position
162
+
163
+ }
164
+
165
+ }
166
+
167
+ }
168
+
169
+ ```

3

文面、タイトルなど大幅変更。内容の実質的な変更はなし。

2015/06/03 08:02

投稿

taratail
taratail

スコア76

test CHANGED
@@ -1 +1 @@
1
- 一つのUIBezierPathで作られた軌跡上を複数回に区切ってUI(Image)View移動させたい
1
+ ベジェ曲線で作られた軌跡上をUIImageView移動
test CHANGED
@@ -1,11 +1,19 @@
1
- 一つのUIBezierPathで作られた軌跡の上複数回に区切ってUI(Image)View移動させたいです。
1
+ ベジェ曲線状をUIImageView移動するプログラムを書きたいです。
2
2
 
3
+
4
+
3
- 例えば以下のサイトで、放物線のパスは一つでanimation.duration = 1.0となっています。
5
+ 例えば以下のサイトで、UIBezierPathで作られた放物線一つのパスanimation.duration = 1.0の時間で移動します。
4
6
 
5
7
  [http://qiita.com/shu223/items/c15547667f8318d4acfe](http://qiita.com/shu223/items/c15547667f8318d4acfe)
6
8
 
9
+
10
+
7
- このような一つのパス上を指定した時間で動ききるのでなく、途中まで動いて適当な位置で静止、再度動く、静止、という風にしてUI(Image)Viewを動かせないかと考えています。UIBezierPathの軌跡は変わらないものの、静止するタイミングが変わるため、複数のBezierPathの軌跡に分けることが出来ません。
11
+ このような一つのパス上を指定した時間で動ききるのでなく、途中まで動いて適当な位置で静止、再度動く、静止、という風にしてUIImageViewを動かせないかと考えています。
8
12
 
9
13
 
10
14
 
11
- 当方Swiftを用てアリを作成しようとしていますが、ほぼ同じだと思うでObjective-Cにつての解答も構いせん。ご教示いただけたらと思います。
15
+ 以下Plague.incとうゲームのレイ動画ですが、動画の船の動きを実現したいです。止ったり早く動いたりします。
16
+
17
+ [https://www.youtube.com/watch?v=7Z9Myjx6xZg](https://www.youtube.com/watch?v=7Z9Myjx6xZg)
18
+
19
+ このような処理をSpriteKitなどのフレームワークを使わずに実現したいです。ご教示いただけませんでしょうか。

2

些細な変更

2015/06/02 07:12

投稿

taratail
taratail

スコア76

test CHANGED
File without changes
test CHANGED
@@ -8,4 +8,4 @@
8
8
 
9
9
 
10
10
 
11
- 当方はSwiftを用いてアプリを作成しようとしていますが、ほぼ同じだと思うのでObjective-Cについての解答でも構いません。ご教いただけたらと思います。
11
+ 当方はSwiftを用いてアプリを作成しようとしていますが、ほぼ同じだと思うのでObjective-Cについての解答でも構いません。ご教いただけたらと思います。

1

リンクを貼った

2015/06/01 10:11

投稿

taratail
taratail

スコア76

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  例えば以下のサイトで、放物線のパスは一つでanimation.duration = 1.0となっています。
4
4
 
5
- http://qiita.com/shu223/items/c15547667f8318d4acfe
5
+ [http://qiita.com/shu223/items/c15547667f8318d4acfe](http://qiita.com/shu223/items/c15547667f8318d4acfe)
6
6
 
7
7
  このような一つのパス上を、指定した時間で動ききるのではなく、途中まで動いて適当な位置で静止、再度動く、静止、という風にしてUI(Image)Viewを動かせないかと考えています。UIBezierPathの軌跡は変わらないものの、静止するタイミングが変わるため、複数のBezierPathの軌跡に分けることが出来ません。
8
8