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

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

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

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Xcode

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

Swift

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

iPhone

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

Q&A

解決済

1回答

1573閲覧

CATextLayerのstringにアクセスしたい。

AppDvl

総合スコア58

iOS

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Xcode

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

Swift

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

iPhone

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

0グッド

0クリップ

投稿2020/04/25 13:21

編集2020/04/26 08:45

下のコードのとおり「画面をタッチしたら丸とその番号が表示されるアプリ」を作っています。

タッチして丸と番号を表示した後に、番号を変更する必要があり、ViewControllerから
class MyShapeLayerのCATextLayerのstringにアクセスして変更したいのですが、その方法が分かりません。

基本的なことかもしれませんが
どなたかご教授お願いします。

試したこと
MyShapeLayer.string
は下記のエラーが出ます
Type 'MyShapeLayer' has no member 'string'

class ViewController var selectLayer:CALayer! //最後にタッチされた座標をいれておく private var touchLastPoint:CGPoint! override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { selectLayer = nil let touch : UITouch = touches.first! let layer:CALayer = hitLayer(touch: touch) let touchPoint:CGPoint = touch.location(in: self.view) touchLastPoint=touchPoint self.selectLayerFunc(layer:layer) let oval = MyShapeLayer() oval.frame = CGRect(x:touchLastPoint.x-15,y:touchLastPoint.y-15,width:30,height:30) print("oval.position(oval.position)") oval.drawOval(lineWidth:1,textLayerNO:textLayerNO) textLayerNO += 1 name += 1 //丸に名前をつけてからaddする oval.name = String(name) self.view.layer.addSublayer(oval)//丸を追加 MyShapeLayer.string = "1" //←ココで変えたいが.stringプロパティがないです。 }
class MyShapeLayer: CALayer { func drawRect(lineWidth:CGFloat){ let rect = CAShapeLayer() rect.strokeColor = UIColor.black.cgColor rect.fillColor = UIColor.clear.cgColor rect.lineWidth = lineWidth rect.path = UIBezierPath(rect:CGRect(x:0,y:0,width:self.frame.width,height:self.frame.height)).cgPath self.addSublayer(rect) } var textLayerNO:Int = 1 //丸を描く関数 - CALayerの上に、そのCALayerのサイズと同じサイズのCAShapeLayerをのせています。 func drawOval(lineWidth:CGFloat,textLayerNO:Int){ let textLayer = CATextLayer() textLayer.string = String(textLayerNO) //←ココ textLayer.foregroundColor = UIColor.green.cgColor if textLayerNO > 99 { textLayer.fontSize = 13 textLayer.frame = CGRect(x:4,y:8,width:self.frame.width, height: self.frame.height) } else if textLayerNO > 9{ textLayer.fontSize = 20 textLayer.frame = CGRect(x:4,y:2.5,width:self.frame.width, height: self.frame.height) }else{ textLayer.fontSize = 20 textLayer.frame = CGRect(x:9,y:2.5,width:self.frame.width, height: self.frame.height) } self.addSublayer(textLayer) let ovalShapeLayer = CAShapeLayer() ovalShapeLayer.strokeColor = UIColor.green.cgColor ovalShapeLayer.fillColor = UIColor.clear.cgColor ovalShapeLayer.opacity = 1 //透過 ovalShapeLayer.lineWidth = lineWidth ovalShapeLayer.path = UIBezierPath(ovalIn: CGRect(x:0, y:0, width:self.frame.width, height: self.frame.height)).cgPath ovalShapeLayer.name = String(textLayerNO) self.addSublayer(ovalShapeLayer) } }

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

MyShapeLayerクラス内のCATextLayerをインスタンス変数として保持しておいて、ViewController側からアクセスするのはいかがでしょうか。
他にも方法あるかもしれませんが、一つの案としてご確認ください。

手順1、MySapeLayerクラス内に、CATextLayerをインスタンス変数として宣言
手順2、drawOvalメソッド内のCATextLayer宣言箇所をコメントアウト
手順3、ViewController側で、インスタンス変数として宣言したCATextLayerにアクセスする

Swift

1 2// MyShapeLayer側 3 4class MyShapeLayer: CALayer { 5 6 // 追加 7 public var textLayer = CATextLayer() 8 9 func drawRect(lineWidth:CGFloat){ 10 let rect = CAShapeLayer() 11 rect.strokeColor = UIColor.black.cgColor 12 rect.fillColor = UIColor.clear.cgColor 13 rect.lineWidth = lineWidth 14 rect.path = UIBezierPath(rect:CGRect(x:0,y:0,width:self.frame.width,height:self.frame.height)).cgPath 15 self.addSublayer(rect) 16 } 17 18 var textLayerNO:Int = 1 19 //丸を描く関数 - CALayerの上に、そのCALayerのサイズと同じサイズのCAShapeLayerをのせています。 20 func drawOval(lineWidth:CGFloat,textLayerNO:Int){ 21 22 // コメントアウト 23 // let textLayer = CATextLayer() 24 25 〜 以下省略(記載頂いた処理と同様のため)26 } 27} 28

Swift

1 2// ViewController側 3 4let oval = MyShapeLayer() 5oval.frame = CGRect(x:touchLastPoint.x-15,y:touchLastPoint.y-15,width:30,height:30) 6print("oval.position(oval.position)") 7oval.drawOval(lineWidth:1,textLayerNO:textLayerNO) 8textLayerNO += 1 9name += 1 //丸に名前をつけてからaddする 10oval.name = String(name) 11self.view.layer.addSublayer(oval)//丸を追加 12 13// 変更 14//MyShapeLayer.string = "1" //←ココで変えたいが.stringプロパティがないです。 15oval.textLayer.string = "test" 16

投稿2020/04/26 11:04

tsuki01

総合スコア1751

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

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

AppDvl

2020/04/27 10:27

tsuki01さん ご指摘の通りに修正するときちんと動きました。 「手順1、MySapeLayerクラス内に、CATextLayerをインスタンス変数として宣言」 という発想がありませんでした。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問