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

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

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

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

iPhone

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

3回答

7689閲覧

描画した円の削除

tamago0224

総合スコア71

iOS

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

iPhone

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/02/04 05:11

質問です。
swiftで画面をタップすることで円を描画するアプリケーションを作りました。
そこで、こんどは描画した円を全削除したいのですが、方法がよくわかりません。回答の方をお願いします。
プログラムは下に記載しておきます。

ViewController.swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 private var myToolBar: UIToolbar! 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additional setup after loading the view, typically from a nib. 10 11 //ツールバーの設定 12 myToolBar = UIToolbar(frame: CGRectMake(0, self.view.bounds.height - 44, self.view.bounds.width, 40)) 13 myToolBar.layer.position = CGPoint(x: self.view.bounds.width / 2, y: self.view.bounds.height - 20) 14 15 myToolBar.barStyle = .Default 16 myToolBar.tintColor = UIColor.whiteColor() 17 myToolBar.backgroundColor = UIColor.blackColor() 18 19 //ツールバーのボタン生成 20 let myClearToolButton = UIBarButtonItem(title: "Clear", style: .Plain, target: self, action: "onTapClear:") 21 myToolBar.items = [myClearToolButton]//ツールバーにアイテムを追加 22 self.view.addSubview(myToolBar) 23 24 let ovalShapeLayer: CAShapeLayer = CAShapeLayer()//CAShapeLayerのインスタンス生成 25 ovalShapeLayer.strokeColor = UIColor.blackColor().CGColor//図形の枠線の色設定 26 ovalShapeLayer.fillColor = randomColor().CGColor 27 ovalShapeLayer.path = UIBezierPath(ovalInRect: CGRect(x: self.view.bounds.width / 2, y: self.view.bounds.height / 2, width: 50.0, height: 50.0)).CGPath 28 self.view.layer.addSublayer(ovalShapeLayer) 29 30 } 31 32 override func didReceiveMemoryWarning() { 33 super.didReceiveMemoryWarning() 34 // Dispose of any resources that can be recreated. 35 } 36 37 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 38 if let touch = touches.first { 39 let pos = touch.locationInView(self.view) 40 print(pos) 41 42 drawOval(posx: pos.x, posy: pos.y) 43 } 44 } 45 46 internal func onTapClear(sender: UIBarButtonItem) { 47 print("Clear") 48 } 49 50 func drawOval(posx x: CGFloat, posy y: CGFloat) { 51 let ovalShapeLayer: CAShapeLayer = CAShapeLayer()//CAShapeLayerのインスタンス生成 52 ovalShapeLayer.strokeColor = UIColor.clearColor().CGColor//図形の枠線の色設定 53 ovalShapeLayer.fillColor = randomColor().CGColor 54 //ovalShapeLayer.fillColor = UIColor.blackColor().CGColor 55 56 ovalShapeLayer.path = UIBezierPath(ovalInRect: CGRect(x: x - 25.0, y: y - 25.0, width: 50.0, height: 50.0)).CGPath 57 58 self.view.layer.addSublayer(ovalShapeLayer) 59 } 60 61 func randomColor() -> UIColor { 62 let rand1 = CGFloat(getRandomNumber(Min: 0, Max: 1.0)) 63 let rand2 = CGFloat(getRandomNumber(Min: 0, Max: 1.0)) 64 let rand3 = CGFloat(getRandomNumber(Min: 0, Max: 1.0)) 65 let rand4 = CGFloat(getRandomNumber(Min: 0, Max: 1.0)) 66 67 print("rand1 is \(rand1)") 68 print("rand2 is \(rand2)") 69 print("rand3 is \(rand3)") 70 print("rand4 is \(rand3)") 71 72 let randColor = UIColor(red: rand1, green: rand2, blue: rand3, alpha: rand4) 73 74 return randColor 75 } 76 77 func getRandomNumber(Min _Min : Float, Max _Max : Float)->Float { 78 79 return ( Float(arc4random_uniform(UINT32_MAX)) / Float(UINT32_MAX) ) * (_Max - _Min) + _Min 80 } 81} 82

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

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

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

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

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

guest

回答3

0

ベストアンサー

self.view.layer.addSublayer(ovalShapeLayer)

としたものを

internal func onTapClear(sender: UIBarButtonItem) { print("Clear") }

ここで全部削除したいという認識で大丈夫ですか?

それであれば、ViewControllerにaddSublayerするCAShapeLayerをすべて保持しておき、onTapClearで一気に削除するのが良いでしょう。

class ViewController: UIViewController { private var addedLayers = [CAShapeLayer]() ... func drawOval(posx x: CGFloat, posy y: CGFloat) { ... self.view.layer.addSublayer(ovalShapeLayer) // ここで保持しておく self.addedLayers.append(ovalShapeLayer) } ... func onTapClear(sender: UIBarButtonItem) { // 全消し self.addedLayers.forEach { $0.removeFromSuperlayer() } }

ビルド確認していないのでビルド通るかわかりませんが、CALayerにはremoveFromSuperlayerというメソッドがあるのでそれを使ってください。

投稿2016/02/04 07:41

yukiasai

総合スコア33

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

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

0

http://qiita.com/edo_m18/items/8b6b457f82b185ab1f6a
これがさんこうになるんじゃないでしょうか。サブview自体を切り替えることで削除とみなすのかな?

投稿2016/02/04 06:49

ipadcaron

総合スコア1693

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

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

0

よく読んでいないので直感の回答になりますが、
self.view.layer.addSublayer(ovalShapeLayer) のところで追加しているオブジェクトを
削除すれば消えるのではないでしょうか。

投稿2016/02/04 05:25

YasuhiroMiyake

総合スコア1336

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

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

tamago0224

2016/02/04 05:59

そのオブジェクトを削除する方法が知りたいのです.
YasuhiroMiyake

2016/02/04 07:09

CALayerのリファレンスは確認済みでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問