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

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

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

Swift Playgroundは、Swiftをインタラクティブに習得できるiPad向けのアプリケーション。コーディングの知識は一切必要なく、Swift Playgrounds上でプログラミングしたコードによりドローン・ロボットを自在に動かすことが可能です。

Xcode

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

Swift

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

Q&A

解決済

1回答

1607閲覧

【Swift4】円型の枠線付きUIViewを作成したら枠線の外側に不要な線が表示されてしまう

0331UTTI

総合スコア6

Swift Playground

Swift Playgroundは、Swiftをインタラクティブに習得できるiPad向けのアプリケーション。コーディングの知識は一切必要なく、Swift Playgrounds上でプログラミングしたコードによりドローン・ロボットを自在に動かすことが可能です。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/08/26 07:14

前提・実現したいこと

swift4にて、太い枠を付けた円をUIViewで作成したいのですが、いつもは気にならない現象に気づいてしまいました。
これについてご教授いただきたいです。
↓にPlayGroundのコードを記載しています。

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

赤色の円をUIViewで作成し、白い枠線を設定しています。
すると、枠線の外側にうっすら赤い線が見えてしまいます。
どうしたらこのうっすら線が見えずにきれいな枠線付き円を表現できますか?

イメージ説明

該当のソースコード

swift

1//: A UIKit based Playground for presenting user interface 2 3import UIKit 4import PlaygroundSupport 5 6class MyViewController : UIViewController { 7 override func loadView() { 8 let view = UIView() 9 view.backgroundColor = .white 10 11 let circle = UIView() 12 circle.frame = CGRect(x: 10, y: 10, width: 300, height: 300) 13 circle.backgroundColor = .red 14 circle.layer.cornerRadius = 150 15 circle.layer.borderColor = UIColor.white.cgColor 16 circle.layer.borderWidth = 50 17 18 19 view.addSubview(circle) 20 self.view = view 21 } 22} 23// Present the view controller in the Live View window 24PlaygroundPage.current.liveView = MyViewController() 25 26

試したこと

現場で遭遇した現象で、試しにPlayGroundでも実装してみたところ再現されました。
同じ状況で困っている人が見当たらなかったので質問させていただきました。

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

swift4、xcode10.3を使用しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

アンチエイリアシングの都合上仕方なくそうなるのかなと思います。

stackoverflowで回避されている方がいらっしゃしました。
参考:
https://stackoverflow.com/a/47168684

ちょっとリンク先のコードだとマスクを無駄に作っている気がしたので、以下でもいいのかなとは思いました。
(layer.maskではなくclipToBoundsで代用)

swift

1import UIKit 2 3extension UIView { 4 5 fileprivate var bezierPathIdentifier:String { return "bezierPathBorderLayer" } 6 7 fileprivate var bezierPathBorder:CAShapeLayer? { 8 return (self.layer.sublayers?.filter({ (layer) -> Bool in 9 return layer.name == self.bezierPathIdentifier && (layer as? CAShapeLayer) != nil 10 }) as? [CAShapeLayer])?.first 11 } 12 13 func bezierPathBorder(_ color:UIColor = .white, width:CGFloat = 1) { 14 15 var border = self.bezierPathBorder 16 self.clipsToBounds = true 17 18 if border == nil { 19 border = CAShapeLayer() 20 border!.name = self.bezierPathIdentifier 21 self.layer.addSublayer(border!) 22 } 23 24 border!.frame = self.bounds 25 let pathUsingCorrectInsetIfAny = 26 UIBezierPath(roundedRect: border!.bounds, cornerRadius:self.layer.cornerRadius) 27 28 border!.path = pathUsingCorrectInsetIfAny.cgPath 29 border!.fillColor = UIColor.clear.cgColor 30 border!.strokeColor = color.cgColor 31 border!.lineWidth = width * 2 32 } 33 34 func removeBezierPathBorder() { 35 self.layer.mask = nil 36 self.bezierPathBorder?.removeFromSuperlayer() 37 } 38 39} 40 41class ViewController: UIViewController { 42 43 override func viewDidLoad() { 44 super.viewDidLoad() 45 // Do any additional setup after loading the view. 46 47 48 49 let circle = UIView() 50 circle.frame = CGRect(x: 10, y: 10, width: 300, height: 300) 51 circle.backgroundColor = .red 52 circle.layer.cornerRadius = 150 53 //circle.layer.borderColor = UIColor.white.cgColor 54 //circle.layer.borderWidth = 50 55 circle.bezierPathBorder(.white, width: 50) 56 57 view.addSubview(circle) 58 59 view.backgroundColor = .blue 60 } 61 62 63}

投稿2019/08/26 08:17

takabosoft

総合スコア8356

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

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

0331UTTI

2019/08/26 09:34

アンチエイリアシングの仕様だったんですね。 いただいたコードを参考に解決できました。 回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問