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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

226閲覧

imageUIBezierPathをタイマーの経過に合わせて動かしたい

mahi

総合スコア12

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

1グッド

0クリップ

投稿2019/02/11 08:35

編集2019/02/11 08:45

イメージ説明]
イメージ説明]

##実現したいこと
UIBezierPAthをタイマーの時間と連携して描画しようとしています。
お手数ですがご協力お願いします。

##直面している課題
①ビルド時にシュミレーターにパスが表示されないこと
②タイマーとの連携が上手くいかないこと

##試したこと
①別プロジェクトに該当コードをコピペ -> パスは表示されず
②func arcPercentの引数:secondsをfunc stepの定数:timeと連携させた -> 上手くいかず (連携の方法があっているか良し悪しの判断が出来ない)

##該当のソースコード

class SropWatchViewController: UIViewController { var startTime: TimeInterval = 0 var intervalTime: Double = 0.0 @IBOutlet weak var timerLabel: UILabel! @IBOutlet weak var stopButton: UIButton! @objc func step(){ intervalTime = Date().timeIntervalSince1970 - startTime let time = Int(intervalTime) let h = time / 3600 % 24 let m = time / 60 % 60 let s = time % 60 let displayStr = String(format: "%02d:%02d:%02d",h,m,s) timerLabel.text = displayStr } func arcPercent(_ radius:CGFloat, _ seconds:Double) -> UIBezierPath { let endAngle = 2*Double.pi*seconds/1200 - Double.pi/2 let path = UIBezierPath( arcCenter: CGPoint(x: 0, y: 0), radius: radius, startAngle: CGFloat(-Double.pi/2), endAngle: CGFloat(endAngle), clockwise: true ) return path } func drawLine() -> UIImage { let size = view.bounds.size UIGraphicsBeginImageContextWithOptions(size, false, 1.0) intervalTime = Date().timeIntervalSince1970 - startTime let time = Int(intervalTime) let seconds = time%60 UIColor.red.setStroke() let arcPath = arcPercent(80, Double(seconds)) arcPath.lineWidth = 60 arcPath.lineCapStyle = .butt let tf = CGAffineTransform(translationX: view.center.x, y: view.center.y) arcPath.apply(tf) arcPath.stroke() let image = UIGraphicsGetImageFromCurrentImageContext() return image! } override func viewDidLoad() { super.viewDidLoad() startTime = Date().timeIntervalSince1970 Timer.scheduledTimer( timeInterval: 1.0, target: self, selector: #selector(self.step), userInfo: nil, repeats: true ) timerLabel.text = String("00:00:00") let drawImage = drawLine() let drawView = UIImageView(image: drawImage) view.addSubview(drawView) } }

##xcodeのバージョン

xcode 9.3

tetsuyahachisu👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

回答が付いていないので、解決に向けた道順を提示します。

①ビルド時にシュミレーターにパスが表示されないこと
②タイマーとの連携が上手くいかないこと

まず、①が出来ていないのに②を同時に片付けようとするのが無理があります。
①を確実に完成させてください。
(あと「ビルド時」ではなく「実行時」ですよね)

描画のコア部分はarcPercentで実装されていると思いますが、
ここに決め打ちで引数を渡し、
arcPercent関数の検証を行ってください。

もし期待通りに動かないパターンがあるようでしたら、その原因をデバッグで取り除いてください。

投稿2019/02/12 00:46

takabosoft

総合スコア8356

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

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

mahi

2019/02/21 08:11

回答ありがとうございます。 ①と②を同時に解決しようとしていたのが混乱のもとだったのですね。 override func ~ 内でview.addSubview(drawLine)を追記した所①のパスが表示されない問題は解決できました。また②のタイマーと関数を繋ぐこともできました。 しかし依然タイマーと同期してパスが動いてくれません。 この場合 ①view.addSubview(drawLine)を繰り返し処理 ②drawLine()を繰り返し処理 ③それ以外の方法 どのような方法でタイマーの秒数の経過に合わせてパスが更新されていくように作れるのでしょうか?
takabosoft

2019/02/21 08:17

このままの設計で進めるのならUIImageViewのインスタンスをメンバー変数で取っておいて、imageのみ差し替えればよいかと思います。 ただ、パスを単色で描画するだけでしたら、UIImageViewではなくCAShapeLayerを使ったほうが動作が軽かった記憶があるので時間があれば調べてみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問