2017-08-30 6 views
0

すべてのスタイル情報をクラスに追加し、UIButtonのサブクラスを作成してコードの重複を避けようとしています。現時点でSwift:ButtonクラスにCGSizeを適用しない

、私のクラスは次のようになりますのviewDidLoadで

class CustomButton: UIButton { 


    required init() { 

    super.init(frame: .zero) 

    // set other operations after super.init, if required 
    backgroundColor = .red 
    layer.cornerRadius = 5 
    layer.borderWidth = 1 
    layer.borderColor = UIColor.black.cgColor 
    frame.size = CGSize(width: 700, height: 100) 

    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

} 

私は追加してい:

let b1 = CustomButton() 

    view.addSubview(b1) 

    // auto layout 
    b1.translatesAutoresizingMaskIntoConstraints = false 
    b1.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
    b1.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 

をあなたは私がframe.size

を設定しているクラスで見ることができるように
frame.size = CGSize(width: 700, height: 100) 

しかし、私はそれを実行すると、そうそうです:

enter image description here

幅は明らかにではありません。私が間違っているところには何か提案がありますか?

答えて

1

問題は、フレームと自動レイアウトが混在していることです。具体的には、自動サイズ調整をオフにすると、フレームが消えます。なぜ100%の自動レイアウトをしないのですか?実際には、init()のcenterX/centerYを作成してみませんか?

class CustomButton: UIButton { 

    required init(width:CGFloat, height:CGFloat, centerButton:Bool) { 
     super.init(frame: .zero) 

     // set other operations after super.init, if required 
     backgroundColor = .red 
     layer.cornerRadius = 5 
     layer.borderWidth = 1 
     layer.borderColor = UIColor.black.cgColor 
     self.translatesAutoresizingMaskIntoConstraints = false 
     self.widthAnchor.constraint(equalToConstant: width).isActive = true 
     self.heightAnchor.constraint(equalToConstant: height).isActive = true 
     if centerButton { 
      self.centerXAnchor.constraint(equalTo: superview?.centerXAnchor).isActive = true 
      self.centerYAnchor.constraint(equalTo: superview?.centerYAnchor).isActive = true 
     } 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

} 

とにviewDidLoad()であなたの呼び出しを変更します。

let b1 = CustomButton(width:700, height:100, centerButton:true) 

(私はあなたのコードをより柔軟にするためにinit()に幅/高さの仕様を追加しました。)

EDIT:私の最後までよろしく(かっこ付き)ステートメント。

frame.size = CGSize(width: 700, height: 100) 

をして:あなたはすべてを交換する場合には

self.widthAnchor.constraint(equalToConstant: 700).isActive = true 
self.heightAnchor.constraint(equalToConstant: 100).isActive = true 

すべてが動作します。

私はクラスにすべてのスタイル情報を追加し、コードの回避の重複に UIButtonのサブクラスを作成しようとしています:しかし、あなたの質問に、あなたはまた、(強調鉱山)と言いました。

コードはテストされていませんが、ボタンを作成する際にコードを適応させるために、initにパラメータを追加しました。ニーズに応じて、backgroundColorからcornerRadiusまでのすべてに拡張することができます。

私はそうサブクラス化が私にはあまりにも直感的で、OOPの背景(バック70年代では、実際にトップダウン)から来ます。私が提示したのは、コードの重複を避けるためのサブクラスでした。 Swiftは新しい方法、具体的にはextensionconvenience initを提示します。私はこれらの両方があなたのために働くだろうと思う。私は、拡張とサブクラスの特定の賛否両論については確信していません - 私の感覚は、コードの重複は両方でほぼ同じ(技術的に)ですが、いつもは "現代的な"開発者のツールキット!

+0

あなたはセンターボタンBoolについて説明し、その理由を説明します。私は結局、異なる位置のビューコントローラに6つのボタンを持つつもりです。この質問は、この質問の目的のためにのみ行われました。他のものは画面上のラジウムの場所になります – JamesG

+0

私はそれが完璧に動作するすべての中心のものを取り出す場合、私は答えを受け入れました:) – JamesG

+0

これを取って(と私はテストされていないコードを掲載し、 ...(1)ボトムラインの問題は、フレームと制約を混合し、自動サイズ変更をオフにすることでした。私はこれについてもっと説明するために私の答えに編集を投稿します。 (2)あなたはコードの重複を避けて、私は同意します。私の試みは、特定の問題を修正するだけでなく、 'init'メソッドにあると知っていた分だけ追加することでした。したがって、幅/高さ*と*は、各ボタンを中央に配置するか、指定したようにするかどうかに関係なく、できません。実際には.... – dfd

0

任意のビューの位置またはサイズを決定するには、 フレームベースのレイアウトまたは拘束ベースの自動レイアウトを両方とも使用できません。

ありがとうございました

関連する問題