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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

1回答

1769閲覧

UIBezeirPathをポイントを基準にしてアニメーションさせたい

退会済みユーザー

退会済みユーザー

総合スコア0

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2016/01/29 13:48

UIBezeierPathで描画した線をCGPointで定義したポイントを基準にアニメーションさせたいです。

以下にイメージ図を添付しました。
黒い線が、UIBezierPathで引いた線、赤い丸がCGPointです。

イメージ説明

イメージ説明

画像のとおり、真ん中のCGPointをアニメーションさせて、線の形を変えたいです。

以下のとおり、コードを記述したのですが、なぜかうまくいかず、
お知恵をお貸しいただけたら幸いです。

Swift

1var verticalLine: CAShapeLayer? 2 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 // Do any additional setup after loading the view, typically from a nib. 6 7 let w = UIScreen.mainScreen().bounds.width 8 let h = UIScreen.mainScreen().bounds.height 9 let centerY = h / 2 10 11 verticalLine = CAShapeLayer() 12 verticalLine?.lineWidth = 3.0 13 verticalLine?.strokeColor = UIColor.redColor().CGColor 14 verticalLine?.fillColor = UIColor.clearColor().CGColor 15 16 let bezierPath = UIBezierPath() 17 let point_1 = CGPointMake(0, centerY) 18 let point_2 = CGPointMake(50, centerY) 19 let point_3 = CGPointMake(100, centerY) 20 bezierPath.moveToPoint(point_1) 21 bezierPath.addLineToPoint(point_2) 22 bezierPath.addLineToPoint(point_3) 23 24 verticalLine?.path = bezierPath.CGPath 25 self.view.layer.addSublayer(verticalLine!) 26 } 27 28 29 @IBAction func addAnimation(sender: UIButton) { 30 31 let h = UIScreen.mainScreen().bounds.height 32 let centerY = h / 2 33 34 let bezierPath_move1 = UIBezierPath() 35 let point_1_move1 = CGPointMake(0, centerY) 36 let point_2_move1 = CGPointMake(50, centerY - 100) 37 let point_3_move1 = CGPointMake(100, centerY) 38 bezierPath_move1.moveToPoint(point_1_move1) 39 bezierPath_move1.addLineToPoint(point_2_move1) 40 bezierPath_move1.addLineToPoint(point_3_move1) 41 42 // アニメーション 43 let bounce = CAKeyframeAnimation(keyPath: "path") 44 bounce.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 45 46 let values = [ 47 bezierPath_move1 48 ] 49 50 bounce.values = values 51 bounce.duration = 0.9 52 bounce.removedOnCompletion = false 53 bounce.fillMode = kCAFillModeForwards 54 bounce.delegate = self 55 56 verticalLine?.addAnimation(bounce, forKey: "return") 57 }

こちらのサイトを参考にしました。
CAKeyframeAnimationを使ってUIBezierPathをアニメーションさせる

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

問題点が2つあります。
0. bounce.valuesに代入するのは[CGPath](現在は[UIBeziePath]を代入してしまっています)
0. 同じくbounce.valuesには2つ以上の要素を持つ配列を代入しなければならない

bounce.valuesには各フレームのパスを指定しますが、最低2つは必要です。
CAKeyframeAnimationが自動的に補間してくれるとはいえ、最初と最後のフレームの情報がなければ補間のしようがないためです。

とりあえず動くようにしたいなら、

Swift

1let values = [ 2 verticalLine!.path!, 3 bezierPath_move1.CGPath 4]

とすればとりあえず動くはずです。

投稿2016/01/29 14:49

u39ueda

総合スコア950

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問