UIView(QMUI_Block)

@interface UIView (QMUI_Block)

/**
 在 UIView 的 frame 变化前会调用这个 block,变化途径包括 setFrame:、setBounds:、setCenter:、setTransform:,你可以通过返回一个 rect 来达到修改 frame 的目的,最终执行 [super setFrame:] 时会使用这个 block 的返回值(除了 setTransform: 导致的 frame 变化)。
 @param view 当前的 view 本身,方便使用,省去 weak 操作
 @param followingFrame setFrame: 的参数 frame,也即即将被修改为的 rect 值
 @return 将会真正被使用的 frame 值
 @note 仅当 followingFrame 和 self.frame 值不相等时才会被调用
 */
@property(nullable, nonatomic, copy) CGRect (^qmui_frameWillChangeBlock)(__kindof UIView *view, CGRect followingFrame);

/**
 在 UIView 的 frame 变化后会调用这个 block,变化途径包括 setFrame:、setBounds:、setCenter:、setTransform:,可用于监听布局的变化,或者在不方便重写 layoutSubviews 时使用这个 block 代替。
 @param view 当前的 view 本身,方便使用,省去 weak 操作
 @param precedingFrame 修改前的 frame 值
 */
@property(nullable, nonatomic, copy) void (^qmui_frameDidChangeBlock)(__kindof UIView *view, CGRect precedingFrame);

/**
 在 UIView 的 layoutSubviews 调用后的下一个 runloop 调用。如果不放到下一个 runloop,直接就调用,会导致先于子类重写的 layoutSubviews 就调用,这样就无法获取到正确的 subviews 的布局。
 @param view 当前的 view 本身,方便使用,省去 weak 操作
 @note 如果某些 view 重写了 layoutSubviews 但没有调用 super,则这个 block 也不会被调用
 */
@property(nullable, nonatomic, copy) void (^qmui_layoutSubviewsBlock)(__kindof UIView *view);

/**
 当 tintColorDidChange 被调用的时候会调用这个 block,就不用重写方法了
 @param view 当前的 view 本身,方便使用,省去 weak 操作
 */
@property(nullable, nonatomic, copy) void (^qmui_tintColorDidChangeBlock)(__kindof UIView *view);

/**
 当 hitTest:withEvent: 被调用时会调用这个 block,就不用重写方法了
 @param point 事件产生的 point
 @param event 事件
 @param super 的返回结果
 */
@property(nullable, nonatomic, copy) __kindof UIView * (^qmui_hitTestBlock)(CGPoint point, UIEvent *event, __kindof UIView *originalView);

@end

Undocumented

  • 在 UIView 的 frame 变化前会调用这个 block,变化途径包括 setFrame:、setBounds:、setCenter:、setTransform:,你可以通过返回一个 rect 来达到修改 frame 的目的,最终执行 [super setFrame:] 时会使用这个 block 的返回值(除了 setTransform: 导致的 frame 变化)。

    Note

    仅当 followingFrame 和 self.frame 值不相等时才会被调用

    Declaration

    Objective-C

    @property (nonatomic, copy, nullable) CGRect (^) (__kindof UIView *_Nonnull, CGRect) qmui_frameWillChangeBlock;

    Swift

    var qmui_frameWillChangeBlock: ((UIView, CGRect) -> CGRect)? { get set }

    Parameters

    view

    当前的 view 本身,方便使用,省去 weak 操作

    followingFrame

    setFrame: 的参数 frame,也即即将被修改为的 rect 值

    Return Value

    将会真正被使用的 frame 值

  • 在 UIView 的 frame 变化后会调用这个 block,变化途径包括 setFrame:、setBounds:、setCenter:、setTransform:,可用于监听布局的变化,或者在不方便重写 layoutSubviews 时使用这个 block 代替。

    Declaration

    Objective-C

    @property (nonatomic, copy, nullable) void (^) (__kindof UIView *_Nonnull, CGRect) qmui_frameDidChangeBlock;

    Swift

    var qmui_frameDidChangeBlock: ((UIView, CGRect) -> Void)? { get set }

    Parameters

    view

    当前的 view 本身,方便使用,省去 weak 操作

    precedingFrame

    修改前的 frame 值

  • 在 UIView 的 layoutSubviews 调用后的下一个 runloop 调用。如果不放到下一个 runloop,直接就调用,会导致先于子类重写的 layoutSubviews 就调用,这样就无法获取到正确的 subviews 的布局。

    Note

    如果某些 view 重写了 layoutSubviews 但没有调用 super,则这个 block 也不会被调用

    Declaration

    Objective-C

    @property (nonatomic, copy, nullable) void (^) (__kindof UIView *_Nonnull) qmui_layoutSubviewsBlock;

    Swift

    var qmui_layoutSubviewsBlock: ((UIView) -> Void)? { get set }

    Parameters

    view

    当前的 view 本身,方便使用,省去 weak 操作

  • 当 tintColorDidChange 被调用的时候会调用这个 block,就不用重写方法了

    Declaration

    Objective-C

    @property (nonatomic, copy, nullable) void (^) (__kindof UIView *_Nonnull) qmui_tintColorDidChangeBlock;

    Swift

    var qmui_tintColorDidChangeBlock: ((UIView) -> Void)? { get set }

    Parameters

    view

    当前的 view 本身,方便使用,省去 weak 操作

  • 当 hitTest:withEvent: 被调用时会调用这个 block,就不用重写方法了

    Declaration

    Objective-C

    @property (nonatomic, copy, nullable) __kindof UIView *_Nonnull (^) (CGPoint, UIEvent *_Nonnull, __kindof UIView *_Nonnull) qmui_hitTestBlock;

    Swift

    var qmui_hitTestBlock: ((CGPoint, UIEvent, UIView) -> UIView)? { get set }

    Parameters

    point

    事件产生的 point

    event

    事件

    super

    的返回结果