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

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

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

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

3回答

3351閲覧

swiftで線分を描写して、ドラッグで移動したい

moaikuntvs

総合スコア23

iOS

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2018/12/26 09:23

swiftで線分を以下のコードで表示させて、ドラッグした位置へ移動させようとしているのですが、移動前の線分が消えずに残ってしまいます。
円も同時に描写して、ドラッグで移動させようとすると、移動前の円は残らなかったです

どうかご教授ください

swift

1//線分 2 horizonalLine.strokeColor = UIColor.black.cgColor 3 horizonalLine.lineWidth = 3.0 4 line.move(to: CGPoint(x:sx,y:sy)) //始点 5 line.addLine(to:CGPoint(x:gx,y:gy)) //終点 6 line.close() //線を結ぶ 7 horizonalLine.path = line.cgPath 8 self.view.layer.addSublayer(horizonalLine) 9 10//円 11ovalShapeLayer.strokeColor = UIColor.blue.cgColor // 輪郭は青 12ovalShapeLayer.fillColor = UIColor.blue.cgColor // 塗りはクリア 13ovalShapeLayer.lineWidth = 1.0 14ovalShapeLayer.path = UIBezierPath(ovalIn: CGRect(x:sx, y:sy, width:5, height:5)).cgPath 15self.view.layer.addSublayer(ovalShapeLayer)

swift

1switch pointXY { 2 case (sx-20...sx+20,sy-20...sy+20): 3 // ドラッグ後の座標 4 let newDx = touchEvent.location(in: self.view).x 5 let newDy = touchEvent.location(in: self.view).y 6 7 // ドラッグしたx座標の移動距離 8 let dx = newDx - preDx 9 //print("x:(dx)") 10 11 // ドラッグしたy座標の移動距離 12 let dy = newDy - preDy 13 //print("y:(dy)") 14 15 sx += dx 16 sy += dy 17 18 //線 19 horizonalLine.strokeColor = UIColor.black.cgColor 20 horizonalLine.lineWidth = 3.0 21 line.move(to: CGPoint(x:sx,y:sy)) //始点 22 line.addLine(to:CGPoint(x:gx,y:gy)) //終点 23 line.close() //線を結ぶ 24 horizonalLine.path = line.cgPath 25 self.view.layer.addSublayer(horizonalLine) 26 27 //円 28 ovalShapeLayer.path = UIBezierPath(ovalIn: CGRect(x:sx, y:sy, width:5, height:5)).cgPath 29 self.view.layer.addSublayer(ovalShapeLayer) 30 31 ovalShapeLayer2.path = UIBezierPath(ovalIn: CGRect(x:gx, y:gy, width:5, height:5)).cgPath 32 self.view.layer.addSublayer(ovalShapeLayer2)

イメージ説明

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

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

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

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

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

guest

回答3

0

一度addSublayer()で追加しておけば、その後はpathだけ変更すればよいです。
(毎回addSublayer()しなくてもプロパティだけ変えれば反映されるはずです)。

投稿2018/12/27 00:59

takabosoft

総合スコア8356

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

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

moaikuntvs

2018/12/27 01:39

Pathだけの変更でも移動前の線は描写されてしまいました。 line.line.removeAllPoints()を入力すると、移動前の線は表示されなくなりました。
takabosoft

2018/12/27 01:44

そっちでしたか、解決してよかったです。lineはUIBezierPath型かなにかかと思うのですが、こいつはメンバーに持つ必要はなさそうです。
guest

0

ベストアンサー

lineが初期化されていないので蓄積されているのではないでしょうか?

投稿2018/12/27 00:52

fuzzball

総合スコア16731

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

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

moaikuntvs

2018/12/27 01:40

ありがとうございます。 おしゃるとおりでした。 line.line.removeAllPoints()を入力すると、移動前の線は表示されなくなりました。
guest

0

sublayerについて詳しく無いので間違ってしまっているかもしれませんがレイヤーを消さずに追加され続けてしまっているのでは無いかと思います。

このコードでlayerを全て削除できるようです
caseの初めに入れたら直しませんかね?

Swift

1self.view.layer.sublayers?.forEach { $0.removeFromSuperlayer() }

stackOverFlow

投稿2018/12/26 10:27

harumi

総合スコア407

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

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

moaikuntvs

2018/12/26 10:51

ありがとうございます。 caseのはじめに入れたのですが、アプリが落ちました。 EXC_BAD_ACCESS (code=1, address=0xe000000000000010)とエラーが出ていました。
harumi

2018/12/26 11:11

うーんだめですか... Swiftの図形描画ライブラリについて詳しく無いのですが図形を追加する際addSubviewで追加することはできないんですか?
moaikuntvs

2018/12/26 14:09

別クラスで線分を描写するコードを書いて、self.view.addSubview(DrawView(frame: self.view.bounds))という形で、Subviewに追加することはできましたが、この場合でも、移動前の線分は消えませんでした。 class DrawView: UIView { override init(frame: CGRect) { super.init(frame: frame); self.backgroundColor = UIColor.clear; } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func draw(_ rect: CGRect) { let path = UIBezierPath() path.removeAllPoints() path.move(to: CGPoint(x: sx, y: sy)) path.addLine(to: CGPoint(x: gx, y: gy)) path.close() UIColor.red.setStroke() path.stroke() }
moaikuntvs

2018/12/27 01:39

ありがとうございます。 line.line.removeAllPoints()を入力すると、移動前の線は表示されなくなりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問