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

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

詳細はこちら
iOS

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

button

HTMLで用いる<button>タグです。

Xcode

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

Swift

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

Q&A

解決済

1回答

2644閲覧

UIButtonのカスタマイズ 角丸/aspect fillにしたい

pi.chan_san

総合スコア3

iOS

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

button

HTMLで用いる<button>タグです。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/03/23 14:35

編集2021/03/24 00:42

前提・実現したいこと

UIButtonのカスタマイズで困っていることがあります。
今やりたいことは、まずUIButtonの角を丸く、またそのUIButtonにおく写真をaspect fillの状態にしたいです。
とても簡単なことかもしれませんが、アドバイスございましたらよろしくお願いします。

該当のソースコード

swift

1class HomePageViewController: UIViewController { 2 3 @IBOutlet weak var homeScrollView: UIScrollView! 4 5 func createContentsView() -> UIView { 6 let homeview = UIView() 7 let homeview_width = homeScrollView.frame.width 8 homeview.frame = CGRect(x: 0, y: 0, width: homeview_width, height: 1000) 9 10 let margin = 28 11 let space = 12 12 let syusyoku = UIButton() 13 syusyoku.setTitle("pasta and rice", for: UIControl.State.normal) 14 let pi = UIImage(named: "3ac4720cd39fcb7bc418a360734f4769f593c4e0.jpg") 15 syusyoku.imageView?.contentMode = .scaleAspectFill //ここに入れて試してみました。 16 syusyoku.layer.masksToBounds = true //ここに入れて試して見ました。 17 syusyoku.setBackgroundImage(pi, for: .normal) 18 syusyoku.setTitleColor(UIColor.white, for: .normal) 19 let child_width = (Int(homeview_width) - margin - space)/2 20 syusyoku.frame = CGRect(x: margin, y: margin, width: child_width, height: child_width) 21 homeview.addSubview(syusyoku) 22 syusyoku.addTarget(self, action: #selector(buttonEvent(_:)), for: UIControl.Event.touchUpInside) 23}

試したこと

角丸に関して

button.layer.masksToBounds = true

aspect fillに関して

button.imageView?.contentMode = .scaleAspectFill

自分的にはこれであっているように見えますが。。
何がおかしいのでしょうか?

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

Swift5
Mac OS 11.2.2
Xcode 12.4

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

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

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

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

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

TsukubaDepot

2021/03/23 22:43

Storyboardと紐付けした変数(プロパティ)、createContentsView()との対応、button.layer.masksToBounds = trueの設定方法などの関係がわからないのですが、コード全体としてはどのように対応づけられているのでしょうか。 少なくとも、このコードだと Storyboard から引っ張ってきた部品に対して、自動的に角丸にすることはできません。 中途半端に省略するよりも、コード全体を掲載されたほうが根本的な勘違いを解決する可能性は高いかと思います。
pi.chan_san

2021/03/24 00:33 編集

ありがとうございます。了解いたしました。情報が足りず申し訳ございません。
pi.chan_san

2021/03/24 00:42 編集

上記に紐付けした、と書きましたが紐付けていませんでした。storyboardに設置したscrollviewのみ紐付け、その上でlet __ = UIViewなどと書いていました。色々と間違いすみません。
guest

回答1

0

ベストアンサー

たとえば、UIButton の画像だけを半径 20px の角丸にするのであれば、

Swift

1 // 半径 20px の角丸にする 2 button.imageView?.layer.cornerRadius = 20

のような感じで実現可能です。
masksToBoundsで角丸にするのではなく、layer.cornerRaduis で角丸にする半径を具体的に指定する必要があります。

ボタンそのものを角丸にし、内包される(サブレイヤになる)View にも角丸を適用させるのであれば

Swift

1 button.layer.cornerRadius = 20 2 button.layer.masksToBounds = true

のような感じでボタンそのものを角丸にした上で、maskToBoundstrue に設定し、サブレイヤにもその効果を適用させる必要があります。

ちなみに、Button に限らず画像をはめ込む際には、余白のことを考慮に入れて設定する必要があります。
特に PNG で背景透過になっていると、角丸に指定しているにもかかわらず、背景透過が原因で角丸に見えないこともあってハマるときがありますのでご注意ください。

下記の例だと、「いらすとや」から借用した画像なのですが、背景透過 PNG なのでそのままでは角丸になったように見えません。なので一度 jpeg に変換し、また角丸の効果がわかるようにあえて view の背景色を赤くしています(透過部分が jpeg によって白色に置き換わっているのがわかるかと思います)。

イメージ説明

以下、検証用のコードです。

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 // StoryBoardで配置する代わりにコードでおいている 5 let button = UIButton() 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additional setup after loading the view. 10 11 // Storyboard で配置するのであれば、ここから以下は省略可能 12 let center = view.center 13 button.frame = CGRect(origin: .zero, size: CGSize(width: 200, height: 200)) 14 button.center = center 15 16 view.addSubview(button) 17 view.backgroundColor = .red 18 19 let image = UIImage(named: "souji_building_madofuki") 20 button.setImage(image, for: .normal) 21 // ここまで省略可能 22 23 // 次の行も Storyboard で設定するなら記述不要 24 button.imageView?.contentMode = .scaleAspectFill 25 26 // 半径 20px の角丸にする 27 button.imageView?.layer.cornerRadius = 20 28 29 // ボタンそのものを角丸にする場合 30// button.layer.cornerRadius = 20 31// button.layer.masksToBounds = true 32 } 33}

投稿2021/03/24 01:13

編集2021/03/24 01:15
TsukubaDepot

総合スコア5086

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

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

pi.chan_san

2021/03/24 02:10

とてもわかりやすかったです!解決しました。有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問