🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Xcode

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

Swift

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

Q&A

解決済

2回答

1498閲覧

Swiftで角丸ラベルに袋文字を表示したい

harucca

総合スコア0

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/01/16 12:04

前提・実現したいこと

Swiftで角丸ラベルに袋文字を表示しようとしています。
https://qiita.com/bu-ka/items/afda427e8dbe03e8e3a2を参考にCGContextを使用して実現しようとしています。

発生している問題・エラーメッセージ

袋文字は表示できたのですが、ラベルの背景の角丸がとれて四角になってしまいます。borderは角丸の状態です。

該当のソースコード

swift

1class DecorateLabel: UILabel { 2 3 var strokeColor = .black 4 var strokeSize:CGFloat = 5.0 5 6 override func drawText(in rect: CGRect) { 7 if let context = UIGraphicsGetCurrentContext() { 8 let textColor = self.textColor 9 10 context.setLineWidth(self.strokeSize) 11 context.setLineJoin(CGLineJoin.round) 12 context.setTextDrawingMode(.stroke) 13 self.textColor = self.strokeColor 14 super.drawText(in: rect) 15 16 context.setTextDrawingMode(.fill) 17 self.textColor = textColor 18 } 19 super.drawText(in: rect) 20 } 21}

呼出し側

swift

1let label = DecorateLabel() 2label.frame = CGRect(x: 10, y: 10, width: 200, height: 50) 3label.textColor = .white 4label.text = "ラベル" 5label.backgroundColor = .blue 6label.layer.cornerRadius = 6.0 7layer.borderColor = .red 8layer.borderWidth = 2.0 9label.clipsToBounds = true

試したこと

Swift初心者でどう対応していいかがわかりません。
上記のdrawText内で下記を追加してみたりしたのですが結果は変わりませんでした

swift

1let path = UIBezierPath(roundedRect: self.bounds, cornerRadius: 6.0)) 2let mask = CAShapeLayer() 3mask.path = path.cgPath 4self.layer.mask = mask

補足情報(FW/ツールのバージョンなど)

swift 5.1.2
xcode 11.2

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

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

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

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

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

guest

回答2

0

自己解決

現象自体はなおらなかったのですが
角丸背景色のViewを作ってその上に透過背景のラベルを重ねるようにしました。

投稿2021/01/27 21:23

harucca

総合スコア0

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

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

0

表示する方のコードに、labelが抜けているところがあります。

layer.borderColor = .red layer.borderWidth = 2.0

これを

label.layer.borderColor = .red label.layer.borderWidth = 2.0

こうしたら良いのではないでしょうか。

なお、labelに対するこれらの処理は、DecorateLabelクラスに取り込んでしまうとスッキリするのかなと思いました。

投稿2021/01/17 05:09

eytyet

総合スコア803

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

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

harucca

2021/01/17 11:09

ご指摘ありがとうございます。 すみません、こちらは手打ちでコピーしたために転記をミスしたようです。 現状、borderに関しては角丸になっているのですが、背景が角丸にならない状態となっていて困っています。角丸borderの外側に背景が角丸にならず表示されている状態です。
eytyet

2021/01/17 11:23 編集

Playgroundでやってみる限りは、抜けているlabelを入れたらそれっぽく表示されました。 背景、と呼んでいるビューは、DecorateLabelですか?それとも、それより上位のビューでしょうか。プログラムを実行中に、Dabug View Hierarchyボタン(四角がふたつ重なったアイコンです)で、ビュー階層を確かめるとヒントがみえてくるかと思います。
harucca

2021/01/21 20:20

返事が遅くなってすみません。背景というのはDecolateLabelです。ラベルの背景色の部分が四角になっています。 開発環境が自宅になくすぐに確認できないのですが、ビュー階層を確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問