2017-06-15 6 views
0

私のシナリオ`layoutSubviews`描画を実行すると、代わりにクロージャを使用してビューをサブクラス化しませんか?

class Button: UIButton { 
    override open func layoutSubviews() { // I cannot do this 
     super.layoutSubviews() 
     layer.cornerRadius = bounds.height/2 
    } 
} 

をサブクラスから私を防ぎ私のシナリオは定数と、このシナリオを使用してから私を防ぎます。そしていいえlayoutSubviewsMyViewに上書きすることはできません。例に文脈を与えるだけです。私は(不可能?)何をしたいです

class MyView: UIView { 

    let buttonHeight: CGFloat = 50 
    lazy var button: UIButton = ... 

    func setupSubViews() { // I cannot do this either.. 
     button.addConstraint(button.heightAnchor.constraint(equalToConstant: buttonHeight)) 
     button.layer.cornerRadius = buttonHeight/2 
    } 
} 

。そして私はMyViewlayoutSubviewsをオーバーライドすることはできません、それは単なる一例にコンテキスト:

class MyView: UIView { 

    lazy var button: UIButton = ... 

    func setupSubViews() { 
     // desired solution, using some closure that will be run when layouting 
     button.whenLayout { button, boundsWhenLayout in 
      button.layer.cornerRadius = boundsWhenLayout.height/2 
     } 
    } 
} 

を与えることですが、私がやりたいことが何とか可能ですか?私は繰り返す、私はサブクラスも高さの定数を使用することはできません。 UIButtonを所有するview/viewcontrollerでlayoutSubviewを使用することはできません。私は一般的な解決策が必要です

多分Objective-C メソッドswizzlingどういうわけか?それとも何らかの変換この程度

+0

MyViewのlayoutSubviewsメソッドをオーバーライドし、そこでボタンを更新できます。 –

+0

@UpholderOfTruth不明なことに申し訳ありません。私はそのビューにアクセスできない。私は文脈を与えるための単なる例でした。これまでどんなサブクラスも使用することはできません。私はlayoutSubviewsにアクセスすることなく変更を適用する能力を必要とする一般的な解決策が必要です。 – Sajjon

+0

MyView(あなたの例)にアクセスできない場合、どのようにボタン自体にアクセスするのですか? –

答えて

0

何を使用して:

startSwizzleメソッドを追加しますUIButtonの拡張がある
private let swizzling: (AnyClass, Selector, Selector) ->() = { forClass, originalSelector, swizzledSelector in 
    let originalMethod = class_getInstanceMethod(forClass, originalSelector) 
    let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) 
    method_exchangeImplementations(originalMethod, swizzledMethod) 
} 

extension UIButton { 
    public func startSwizzle() { 
     let originalSelector = #selector(layoutSubviews) 
     let swizzledSelector = #selector(swizzled_layoutSubviews) 
     swizzling(UIButton.self, originalSelector, swizzledSelector) 
    } 

    func swizzled_layoutSubviews() { 
     swizzled_layoutSubviews() 
     print("swizzled_layoutSubviews ", self.frame) 
    } 

} 

だけで実際のクラスのバージョンの前に)swizzled_layoutSubviewsを(実行されますと呼ばれるとき。

関連する問題