2017-11-30 8 views
-1
class ApplyCorners: UIButton { 
override func didMoveToWindow() { 
    self.layer.cornerRadius = self.frame.height/2 
} 
} 

を再び登場、私は自分のアプリケーション内のボタンにこのクラスを適用し、それは素晴らしい作業が、私はテーブル内のすべてのセルに使用されるボタンにそれを適用するときに表示されますボタンコーナーはビューに入ると丸くなりませんが、ボタンの1つをクリックすると、別のビューに縫い込まれます。私はその後、コーナーは "固定" /ラウンドを後ろに縫う場合。スウィフト:角丸は初登場時に異なって表示されると

緑色は戻り時のボタンで、赤色が最初に表示に入ったときに表示されます。

Image

誰もがこの問題を解決する方法を知っていますか?

答えて

2

私は、ボタンの変更のたびframeを取り込む、layoutSubviewsをお勧めしたい:

class ApplyCorners: UIButton { 

    override func layoutSubviews() { 
     super.layoutSubviews() 
     layer.cornerRadius = frame.height/2 
    } 

} 

これは、両方の世話をします元の外観とその後の外観。また、ビューが表示されたときにframeが知られているかどうかだけでなく、ボタンのサイズを変更する可能性のあるもの(制約や回転イベントなど)があるかどうかに関係するあらゆる種類の問題も回避します。

1

このようなことは、タイミングの問題になりそうです。フレーズself.frame.heightを考えてみましょう。 didMoveToWindowが呼び出された時点で、まだがわからない場合があります私たちのフレーム。レイアウトに依存するメソッドを呼び出す場合は、レイアウトが実際に発生したときにそのメソッドを呼び出します。

0

コードをdidMoveToWindow()に入れることは意味をなさない。代わりにlayoutSubviews()を実装することをおすすめします。このメソッドは、ビューオブジェクトのレイアウトが変更されるたびに呼び出されるため、ビューのサイズを変更すると更新されるはずです。

(TNguyenとし、ロブからのコメントに基づいて私の提案を変更しました。)

+0

まだawakeFromNib()でフレームがまだ間違っている可能性はありません – TNguyen

+0

フレームが変更されると、レイヤーは引き続き正しく描画されます。 layer.cornerWidthのようなプロパティを設定すると、ビューのフレームが変更されたときにレイヤーが正しく描画されます(少なくともビューのコンテンツレイヤーではレイヤーが描画されますが、ビューに他のサブレイヤーを追加するとビューのフレームサイズは変更されません)。 –

+0

彼は静的な数値ではなく動的な数値に設定しています。そして私はOPの投稿で、彼はそれが円であることを望んでいることを推測しています(つまり、半径の半分に半径をコーナーにしたいと思っています)。 – TNguyen

1

別の代替案を提案してください:どんな境界の変化も聞いてください。これにより、「これが呼び出されたときに、まだフレームが設定されていますか?」という疑問を避けることができます。 @Robが指摘

boundsframeを編集
class ApplyCorners: UIButton { 

    override var bounds: CGRect { 
     didSet { 
      layer.cornerRadius = bounds.height/2 
     } 
    } 

} 

理由として、フレームの変更をリッスンすると、時々、初期負荷を欠場する原因となります。

+0

制約を使用すると、 'frame'が直接設定されないことがあります。したがって、この' cornerRadius'は設定されません。 (「フレームが変わるたびにこの丸い角を探している」場合は、実際には 'layoutSubviews'でそれを行う必要があります(https://gist.github.com/robertmryan/4fe84eb264225711f2ae017b379b04c6を参照してください)。 – Rob

+0

@Robありがとうございました。私は実際にプロジェクトで気づいていましたが、 'frame'ではなく' bounds'を見ることは常に 'didSet'(あなたの要点でテスト)を呼び出すことに注意しました。 – Connor

関連する問題