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

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

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

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

Q&A

解決済

2回答

1790閲覧

[Swift4] UIButtonが重なって複数生成されることを回避したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2018/03/27 23:30

編集2018/03/28 00:04

上下するUIViewの上にUIButtonを配置して、カスタムクラス内のlayoutSubviews()で下線を引いています。
UIViewを上下させるとself.view.layoutIfNeeded()から?カスタムクラス内のlayoutSubviews()が呼ばれて?
UIButtonをタップすると、カスタムクラス内のlayoutSubviews()が呼ばれて?
UIButtonの背景となるUIViewが複数生成されてしまうようです?
これを回避したいのですが、どのようにすればよいでしょうか?
下線を違う部分で描写すればよいと思うのですが、どこで描写すればよいでしょうか?
それとも、見た目上は問題ないので、このままでもよいのでしょうか?

githubテストファイル → https://github.com/tyobigoro/testMovableButton

swift

1import UIKit 2class ViewController: UIViewController { 3 4  // 制約のOutlet接続 5 @IBOutlet weak var upperConstraint: NSLayoutConstraint! 6 @IBOutlet weak var lowerConstraint: NSLayoutConstraint! 7 8〜省略〜 9   10  // Viewの上げ下げ 11 @IBAction func MoveView(_ sender: UIButton) { 12 13 // 制約の切り替え 14 if upperConstraint.isActive == true { 15 NSLayoutConstraint.deactivate([upperConstraint]) 16 NSLayoutConstraint.activate([lowerConstraint]) 17 } else { 18 NSLayoutConstraint.deactivate([lowerConstraint]) 19 NSLayoutConstraint.activate([upperConstraint]) 20 21 } 22 //スクロールのアニメーション効果 23 UIView.animate(withDuration: 0.5, animations: { self.view.layoutIfNeeded() }, completion: nil) 24 } 25 } 26

swift

1import UIKit 2// MARK: カスタムビューの定義 3@IBDesignable 4class CustomButton: UIButton { 5 6〜省略〜 7 8 override func layoutSubviews() { 9 super.layoutSubviews() 10 11 12 let line = UIView( 13 frame: CGRect 14 (x:5 , y: frame.size.height - 5, width: frame.size.width - 10, height: 2)) 15 line.backgroundColor = UIColor.red 16 // ここで下線を引いているのがよくないのでしょうか? 17     self.addSubview(line) 18 }

イメージ説明
イメージ説明

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

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

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

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

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

guest

回答2

0

draw(_:)の中で、CoreGraphics(Quarz 2D)かUIBezierPathを使って、直接Viewに描画するのがいいと思います。

「テキストの下線」という意味合いなら、NSAttributedStringを使うのがお手軽かも。

投稿2018/03/28 00:26

fuzzball

総合スコア16731

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

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

退会済みユーザー

退会済みユーザー

2018/03/28 00:39

回答ありがとうございます。 自分の力量不足で手っ取り早くできる方法に落ち着いているのですが、 自由度が高くなると思うので、後々、CoreGraphics、UIBezierPathを使って描写できるようになりたいと思います。
guest

0

ベストアンサー

初期化時に一度下線を引くのはいかがでしょうか?

// CustomBotton.swift override init(frame: CGRect) { super.init(frame: frame) commonInit() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) commonInit() } private func commonInit() { let line = UIView(frame: CGRect(x:5 , y: frame.size.height - 5, width: frame.size.width - 10, height: 2)) line.backgroundColor = UIColor.red self.addSubview(line) } override func layoutSubviews() { super.layoutSubviews() print("CustomButton-layoutSubviews") }

投稿2018/03/28 00:06

newmt

総合スコア1277

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

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

退会済みユーザー

退会済みユーザー

2018/03/28 00:32

迅速な回答、本当にありがとうございます。 イニシャライザ内で下線をひいたところ問題解決しました。 自分の知識不足のため、 下線部分以外は不具合がないように見えたので、 カスタムボタンクラスにイニシャライザを記述していなかったのですが、 記述しておくのがよいのでしょうか?
newmt

2018/03/28 00:51

特にoverrideする必要なければ記述しなくて良いと私は思います。
退会済みユーザー

退会済みユーザー

2018/03/28 00:55

教えていただいて非常に助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問