2017-11-06 8 views
-1

ボタンの選択状態を表示するためのUIButtonサブクラスがあります。選択された状態では、ボタンビューの下部に太い黒線が表示され、選択されていない場合は黒線が表示されません。ただし、これをUIButtonサブクラスで使用すると、黒線表示がオフセットされます。私はインセットで遊んでみましたが、それは問題ではないと思います。UIButtonサブビューはサブクラスでオフセットされています

class TabButton: UIButton { 

    private var height:CGFloat = 5 
    private var selectedIndicator:UIView? 

    override var isSelected: Bool { 
     didSet { 
      selectedIndicator?.isHidden = !isSelected 
     } 
    } 

    fileprivate func initializeSelector(_ frame: CGRect) { 
     selectedIndicator = UIView(frame: CGRect(x: 0, y: frame.size.height - height, width: frame.size.width, height: height)) 
     selectedIndicator?.backgroundColor = UIColor.black 
     self.addSubview(selectedIndicator!) 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     initializeSelector(self.frame) 
    } 
} 

は、目的のボタンは次のようになります:ここに私のサブクラスである

enter image description here

しかし、その代わりに、それは次のようになります。

enter image description here

は誰も私を理解するのに役立ちます

ここで何が起こっているのか、それを修正する方法は?ありがとう!

答えて

1

はlayoutSubviewsにあなたが最後のフレームを取得、これを試してみてください:initializeSelectorが呼び出されたときに

override layoutSubviews() { 
    super.layoutSubviews() 
    selectedIndicator.frame = CGRect(x: 0, y: frame.size.height - height, width: frame.size.width, height: height) 
} 
+0

この回答は間違っています。 'initializeSelector'は' layoutSubviews'の中で 'initializeSelector()'を呼び出すことによって、 'initializeSelector'が新しい' UIView'をサブビューとして挿入するので、ボタンのサブビューとして複数の( 'layoutSubviews'が呼び出される) –

+0

あなたは正しく私のせいです、ありがとう;)私はモバイルアプリから書いていましたが、その方法がビューを追加していることに気付かなかった。私は彼がペン先から目を覚ましていると確信していた。 –

1

selectedIndicatorのフレームは、一度だけ設定されています。ボタンがフレームを変更すると、ではなく、がサブビューのフレームを変更するため、selectedIndicatorのフレームを手動で更新する必要があります。

これを行うには、layoutSubviews()メソッドをUIViewに上書きする必要があります。

override layoutSubviews() { 
    super.layoutSubviews() 
    selectedIndicator?.frame = CGRect(x: 0, y: frame.size.height - height, width: frame.size.width, height: height) 
} 

layoutSubviews()が呼び出されたときに知ってthis答えを参照してください。

関連する問題