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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

1回答

2682閲覧

UIImageViewとCALayerの重なりについて

AppDvl

総合スコア58

iOS

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/03/09 13:08

編集2020/03/10 09:54

######わからないこと
クリックしたら○を描くアプリを作成中です。
ですがUIImageViewの上をクリックしても丸が付きません。
######実現したいこと
UIImageViewの上でもクリックして丸を描きたいです。
######試したこと
重ねる順番に問題があるのかもと思い
imageViewを最背面に移動しましたが結果は変わらずクリックできない。
self.view.sendSubviewToBack(imageView)
どなたかご教授お願いします。
イメージ説明
イメージ説明

ViewController

1import UIKit 2 3class ViewController: UIViewController,UIGestureRecognizerDelegate{ 4 var textLayerNO : Int = 1 //丸の番号 5 6 var imageView = UIImageView() 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 self.view.backgroundColor = UIColor.white 10 11 //MARK:-UIImageViewの設置 12 imageView.image = UIImage(named:"test") 13 imageView.frame = CGRect(x: 0, y: 0, width: 200, height: 200) 14 self.view.addSubview(imageView) 15 self.view.sendSubviewToBack(imageView)//最背面に移動 16 } 17 18 //MARK:- タッチした時 19 var selectLayer:CALayer! 20 //最後にタッチされた座標をいれておく 21 private var touchLastPoint:CGPoint! 22 23 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 24 print("タッチした") 25 self.view.sendSubviewToBack(imageView)//最背面に移動 26 selectLayer = nil //すでに選択されたあレイヤがあるかもしれないのでnilとしておく 27 let touch : UITouch = touches.first! //touches.first! はタッチをしたことを取得 28 let layer:CALayer = hitLayer(touch: touch)//タッチされた場所にあるレイヤを取得 29 let touchPoint:CGPoint = touch.location(in: self.view) //タッチされた座標を取得 30 touchLastPoint=touchPoint //最後にタッチされた場所の座標を入れておく 31 self.selectLayerFunc(layer:layer) //選択されたレイヤをselectLayerに入れる 32 33 //直前の座標との差を取得 34 let touchOffsetPoint:CGPoint = CGPoint(x:touchPoint.x - touchLastPoint.x, 35 y:touchPoint.y - touchLastPoint.y) 36 touchLastPoint = touchPoint 37 38 if (selectLayer != nil){ 39 let px:CGFloat = selectLayer.position.x 40 let py:CGFloat = selectLayer.position.y 41 CATransaction.setDisableActions(true) 42 selectLayer.position = CGPoint(x:px + touchOffsetPoint.x,y:py + touchOffsetPoint.y) 43 selectLayer.borderColor = UIColor.green.cgColor //タッチしたら枠を付けるために色をけ決めておく 44 45 } 46 } 47 48 //MARK:- タッチをした場所にあるレイヤーを取得するhitLayer(touch:)を作成 49 func hitLayer(touch:UITouch) ->CALayer{ 50 var touchPoint:CGPoint = touch.location(in:self.view) 51 touchPoint = self.view.layer.convert(touchPoint, to: self.view.layer.superlayer) 52 return self.view.layer.hitTest(touchPoint)! 53 } 54 55 //MARK:- 選択されたレイヤーをselectLayerに入れている部分 56 func selectLayerFunc(layer:CALayer?) { 57 if((layer == self.view.layer) || (layer == nil)){ 58 selectLayer = nil 59 let oval = MyShapeLayer() 60 oval.frame = CGRect(x:touchLastPoint.x-15,y:touchLastPoint.y-15,width:30,height:30) 61 oval.drawOval(lineWidth:1,textLayerNO:textLayerNO) 62 textLayerNO += 1 63 self.view.layer.addSublayer(oval)//丸を追加 64 self.view.sendSubviewToBack(imageView)//最背面に移動 65 } 66 } 67}

MyShapeLayer

1import UIKit 2 3class MyShapeLayer: CALayer { 4 func drawOval(lineWidth:CGFloat,textLayerNO:Int){ 5 let textLayer = CATextLayer() 6 textLayer.string = String(textLayerNO) 7 textLayer.foregroundColor = UIColor.green.cgColor 8 self.addSublayer(textLayer) 9 10 let ovalShapeLayer = CAShapeLayer() 11 ovalShapeLayer.strokeColor = UIColor.green.cgColor 12 ovalShapeLayer.fillColor = UIColor.clear.cgColor 13 ovalShapeLayer.opacity = 1 //透過 14 ovalShapeLayer.lineWidth = lineWidth 15 ovalShapeLayer.path = UIBezierPath(ovalIn: CGRect(x:0, y:0, width:self.frame.width, height: self.frame.height)).cgPath 16 ovalShapeLayer.name = String(textLayerNO) 17 self.addSublayer(ovalShapeLayer) 18 } 19}

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

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

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

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

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

AppDvl

2020/03/10 09:44

スクショを追加しました。 レイヤの順番はUIImageViewが最上面に来ているようです。
AppDvl

2020/03/10 09:56

ヒエラルキーという機能を初めて知りました。 便利な機能を教えていただきありがとうございます。
guest

回答1

0

ベストアンサー

imageViewにも丸をつけたいだけなら、layerの指定をself.view.layerだけに限定してるところを考え直してあげてください。

swift

1//MARK:- 選択されたレイヤーをselectLayerに入れている部分 2 func selectLayerFunc(layer:CALayer?) { 3 //if((layer == self.view.layer) || (layer == nil)){ // <= ここ変えてあげて 4 selectLayer = nil 5 let oval = MyShapeLayer() 6 oval.frame = CGRect(x:touchLastPoint.x-15,y:touchLastPoint.y-15,width:30,height:30) 7 oval.drawOval(lineWidth:1,textLayerNO:textLayerNO) 8 textLayerNO += 1 9 self.view.layer.addSublayer(oval)//丸を追加 10 self.view.sendSubviewToBack(imageView)//最背面に移動 11 //} <= 動かすだけなのでここも消してあげて 12 }

投稿2020/03/09 16:18

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

AppDvl

2020/03/10 09:52

tyobigorouさん 私が1日悩んだことを即座に答えを教えていただき、感激です。 感謝しかありません、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問