Functions

The following functions are available globally.

无障碍访问

  • Undocumented

    Declaration

    Objective-C

    CG_INLINE void
    AddAccessibilityLabel(NSObject *obj, NSString *label) {
        obj.accessibilityLabel = label;
    }

    Swift

    func AddAccessibilityLabel(_ obj: NSObject!, _ label: String!)
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE void
    AddAccessibilityHint(NSObject *obj, NSString *hint) {
        obj.accessibilityHint = hint;
    }

    Swift

    func AddAccessibilityHint(_ obj: NSObject!, _ hint: String!)

Selector

  • 根据给定的 getter selector 获取对应的 setter selector

    Declaration

    Objective-C

    static inline SEL setterWithGetter(SEL getter)

    Swift

    func setterWithGetter(_ getter: Selector!) -> Selector!

    Parameters

    getter

    目标 getter selector

    Return Value

    对应的 setter selector

CGFloat

  • 某些地方可能会将 CGFLOAT_MIN 作为一个数值参与计算(但其实 CGFLOAT_MIN 更应该被视为一个标志位而不是数值),可能导致一些精度问题,所以提供这个方法快速将 CGFLOAT_MIN 转换为 0 issue: https://github.com/Tencent/QMUI_iOS/issues/203

    Declaration

    Objective-C

    static inline CGFloat removeFloatMin(CGFloat floatValue)

    Swift

    func removeFloatMin(_ floatValue: CGFloat) -> CGFloat
  • 基于指定的倍数,对传进来的 floatValue 进行像素取整。若指定倍数为0,则表示以当前设备的屏幕倍数为准。

    例如传进来 “2.1”,在 2x 倍数下会返回 2.5(0.5pt 对应 1px),在 3x 倍数下会返回 2.333(0.333pt 对应 1px)。

    Declaration

    Objective-C

    static inline CGFloat flatSpecificScale(CGFloat floatValue, CGFloat scale)

    Swift

    func flatSpecificScale(_ floatValue: CGFloat, _ scale: CGFloat) -> CGFloat
  • 基于当前设备的屏幕倍数,对传进来的 floatValue 进行像素取整。

    注意如果在 Core Graphic 绘图里使用时,要注意当前画布的倍数是否和设备屏幕倍数一致,若不一致,不可使用 flat() 函数,而应该用 flatSpecificScale

    Declaration

    Objective-C

    static inline CGFloat flat(CGFloat floatValue)

    Swift

    func flat(_ floatValue: CGFloat) -> CGFloat
  • 类似flat(),只不过 flat 是向上取整,而 floorInPixel 是向下取整

    Declaration

    Objective-C

    static inline CGFloat floorInPixel(CGFloat floatValue)

    Swift

    func floorInPixel(_ floatValue: CGFloat) -> CGFloat
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE BOOL
    between(CGFloat minimumValue, CGFloat value, CGFloat maximumValue) {
        return minimumValue < value && value < maximumValue;
    }

    Swift

    func between(_ minimumValue: CGFloat, _ value: CGFloat, _ maximumValue: CGFloat) -> Bool
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE BOOL
    betweenOrEqual(CGFloat minimumValue, CGFloat value, CGFloat maximumValue) {
        return minimumValue <= value && value <= maximumValue;
    }

    Swift

    func betweenOrEqual(_ minimumValue: CGFloat, _ value: CGFloat, _ maximumValue: CGFloat) -> Bool
  • 调整给定的某个 CGFloat 值的小数点精度,超过精度的部分按四舍五入处理。

    例如 CGFloatToFixed(0.3333, 2) 会返回 0.33,而 CGFloatToFixed(0.6666, 2) 会返回 0.67

    Warning

    参数类型为 CGFloat,也即意味着不管传进来的是 float 还是 double 最终都会被强制转换成 CGFloat 再做计算

    Warning

    该方法无法解决浮点数精度运算的问题,如需做浮点数的 == 判断,可用下方的 CGFloatEqualToFloat()

    Declaration

    Objective-C

    static inline CGFloat CGFloatToFixed(CGFloat value, NSUInteger precision)

    Swift

    func CGFloatToFixed(_ value: CGFloat, _ precision: UInt) -> CGFloat
  • 将给定的两个 CGFloat 进行等值比较,并通过参数 precision 指定要考虑的小数点后的精度,内部会将浮点数转成整型,从而避免浮点数精度导致的 == 判断错误。 例如 CGFloatEqualToFloatWithPrecision(1.000, 0.999, 0) 会返回 YES,但 1.000 == 0.999 会得到 NO。

    Declaration

    Objective-C

    static inline BOOL CGFloatEqualToFloatWithPrecision(CGFloat value1,
                                                        CGFloat value2,
                                                        NSUInteger precision)

    Swift

    func CGFloatEqualToFloatWithPrecision(_ value1: CGFloat, _ value2: CGFloat, _ precision: UInt) -> Bool
  • 将给定的两个 CGFloat 进行等值比较,不考虑小数点后的数值。 例如 CGFloatEqualToFloat(1.000, 0.999) 会返回 YES,但 1.000 == 0.999 会得到 NO。

    Declaration

    Objective-C

    static inline BOOL CGFloatEqualToFloat(CGFloat value1, CGFloat value2)

    Swift

    func CGFloatEqualToFloat(_ value1: CGFloat, _ value2: CGFloat) -> Bool
  • 用于居中运算

    Declaration

    Objective-C

    static inline CGFloat CGFloatGetCenter(CGFloat parent, CGFloat child)

    Swift

    func CGFloatGetCenter(_ parent: CGFloat, _ child: CGFloat) -> CGFloat
  • 检测某个数值如果为 NaN 则将其转换为 0,避免布局中出现 crash

    Declaration

    Objective-C

    static inline CGFloat CGFloatSafeValue(CGFloat value)

    Swift

    func CGFloatSafeValue(_ value: CGFloat) -> CGFloat

CGPoint

  • 两个point相加

    Declaration

    Objective-C

    static inline CGPoint CGPointUnion(CGPoint point1, CGPoint point2)

    Swift

    func CGPointUnion(_ point1: CGPoint, _ point2: CGPoint) -> CGPoint
  • 获取rect的center,包括rect本身的x/y偏移

    Declaration

    Objective-C

    static inline CGPoint CGPointGetCenterWithRect(CGRect rect)

    Swift

    func CGPointGetCenterWithRect(_ rect: CGRect) -> CGPoint
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGPoint
    CGPointGetCenterWithSize(CGSize size) {
        return CGPointMake(flat(size.width / 2.0), flat(size.height / 2.0));
    }

    Swift

    func CGPointGetCenterWithSize(_ size: CGSize) -> CGPoint
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGPoint
    CGPointToFixed(CGPoint point, NSUInteger precision) {
        CGPoint result = CGPointMake(CGFloatToFixed(point.x, precision), CGFloatToFixed(point.y, precision));
        return result;
    }

    Swift

    func CGPointToFixed(_ point: CGPoint, _ precision: UInt) -> CGPoint
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGPoint
    CGPointRemoveFloatMin(CGPoint point) {
        CGPoint result = CGPointMake(removeFloatMin(point.x), removeFloatMin(point.y));
        return result;
    }

    Swift

    func CGPointRemoveFloatMin(_ point: CGPoint) -> CGPoint

UIEdgeInsets

  • 获取UIEdgeInsets在水平方向上的值

    Declaration

    Objective-C

    static inline CGFloat UIEdgeInsetsGetHorizontalValue(UIEdgeInsets insets)

    Swift

    func UIEdgeInsetsGetHorizontalValue(_ insets: UIEdgeInsets) -> CGFloat
  • 获取UIEdgeInsets在垂直方向上的值

    Declaration

    Objective-C

    static inline CGFloat UIEdgeInsetsGetVerticalValue(UIEdgeInsets insets)

    Swift

    func UIEdgeInsetsGetVerticalValue(_ insets: UIEdgeInsets) -> CGFloat
  • 将两个UIEdgeInsets合并为一个

    Declaration

    Objective-C

    static inline UIEdgeInsets UIEdgeInsetsConcat(UIEdgeInsets insets1,
                                                  UIEdgeInsets insets2)

    Swift

    func UIEdgeInsetsConcat(_ insets1: UIEdgeInsets, _ insets2: UIEdgeInsets) -> UIEdgeInsets
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE UIEdgeInsets
    UIEdgeInsetsSetTop(UIEdgeInsets insets, CGFloat top) {
        insets.top = flat(top);
        return insets;
    }

    Swift

    func UIEdgeInsetsSetTop(_ insets: UIEdgeInsets, _ top: CGFloat) -> UIEdgeInsets
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE UIEdgeInsets
    UIEdgeInsetsSetLeft(UIEdgeInsets insets, CGFloat left) {
        insets.left = flat(left);
        return insets;
    }

    Swift

    func UIEdgeInsetsSetLeft(_ insets: UIEdgeInsets, _ left: CGFloat) -> UIEdgeInsets
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE UIEdgeInsets
    UIEdgeInsetsSetBottom(UIEdgeInsets insets, CGFloat bottom) {
        insets.bottom = flat(bottom);
        return insets;
    }

    Swift

    func UIEdgeInsetsSetBottom(_ insets: UIEdgeInsets, _ bottom: CGFloat) -> UIEdgeInsets
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE UIEdgeInsets
    UIEdgeInsetsSetRight(UIEdgeInsets insets, CGFloat right) {
        insets.right = flat(right);
        return insets;
    }

    Swift

    func UIEdgeInsetsSetRight(_ insets: UIEdgeInsets, _ right: CGFloat) -> UIEdgeInsets
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE UIEdgeInsets
    UIEdgeInsetsToFixed(UIEdgeInsets insets, NSUInteger precision) {
        UIEdgeInsets result = UIEdgeInsetsMake(CGFloatToFixed(insets.top, precision), CGFloatToFixed(insets.left, precision), CGFloatToFixed(insets.bottom, precision), CGFloatToFixed(insets.right, precision));
        return result;
    }

    Swift

    func UIEdgeInsetsToFixed(_ insets: UIEdgeInsets, _ precision: UInt) -> UIEdgeInsets
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE UIEdgeInsets
    UIEdgeInsetsRemoveFloatMin(UIEdgeInsets insets) {
        UIEdgeInsets result = UIEdgeInsetsMake(removeFloatMin(insets.top), removeFloatMin(insets.left), removeFloatMin(insets.bottom), removeFloatMin(insets.right));
        return result;
    }

    Swift

    func UIEdgeInsetsRemoveFloatMin(_ insets: UIEdgeInsets) -> UIEdgeInsets

CGSize

  • 判断一个 CGSize 是否存在 NaN

    Declaration

    Objective-C

    static inline BOOL CGSizeIsNaN(CGSize size)

    Swift

    func CGSizeIsNaN(_ size: CGSize) -> Bool
  • 判断一个 CGSize 是否存在 infinite

    Declaration

    Objective-C

    static inline BOOL CGSizeIsInf(CGSize size)

    Swift

    func CGSizeIsInf(_ size: CGSize) -> Bool
  • 判断一个 CGSize 是否为空(宽或高为0)

    Declaration

    Objective-C

    static inline BOOL CGSizeIsEmpty(CGSize size)

    Swift

    func CGSizeIsEmpty(_ size: CGSize) -> Bool
  • 判断一个 CGSize 是否合法(例如不带无穷大的值、不带非法数字)

    Declaration

    Objective-C

    static inline BOOL CGSizeIsValidated(CGSize size)

    Swift

    func CGSizeIsValidated(_ size: CGSize) -> Bool
  • 将一个 CGSize 像素对齐

    Declaration

    Objective-C

    static inline CGSize CGSizeFlatted(CGSize size)

    Swift

    func CGSizeFlatted(_ size: CGSize) -> CGSize
  • 将一个 CGSize 以 pt 为单位向上取整

    Declaration

    Objective-C

    static inline CGSize CGSizeCeil(CGSize size)

    Swift

    func CGSizeCeil(_ size: CGSize) -> CGSize
  • 将一个 CGSize 以 pt 为单位向下取整

    Declaration

    Objective-C

    static inline CGSize CGSizeFloor(CGSize size)

    Swift

    func CGSizeFloor(_ size: CGSize) -> CGSize
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGSize
    CGSizeToFixed(CGSize size, NSUInteger precision) {
        CGSize result = CGSizeMake(CGFloatToFixed(size.width, precision), CGFloatToFixed(size.height, precision));
        return result;
    }

    Swift

    func CGSizeToFixed(_ size: CGSize, _ precision: UInt) -> CGSize
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGSize
    CGSizeRemoveFloatMin(CGSize size) {
        CGSize result = CGSizeMake(removeFloatMin(size.width), removeFloatMin(size.height));
        return result;
    }

    Swift

    func CGSizeRemoveFloatMin(_ size: CGSize) -> CGSize

CGRect

  • 判断一个 CGRect 是否存在 NaN

    Declaration

    Objective-C

    static inline BOOL CGRectIsNaN(CGRect rect)

    Swift

    func CGRectIsNaN(_ rect: CGRect) -> Bool
  • 系统提供的 CGRectIsInfinite 接口只能判断 CGRectInfinite 的情况,而该接口可以用于判断 INFINITY 的值

    Declaration

    Objective-C

    static inline BOOL CGRectIsInf(CGRect rect)

    Swift

    func CGRectIsInf(_ rect: CGRect) -> Bool
  • 判断一个 CGRect 是否合法(例如不带无穷大的值、不带非法数字)

    Declaration

    Objective-C

    static inline BOOL CGRectIsValidated(CGRect rect)

    Swift

    func CGRectIsValidated(_ rect: CGRect) -> Bool
  • 检测某个 CGRect 如果存在数值为 NaN 的则将其转换为 0,避免布局中出现 crash

    Declaration

    Objective-C

    static inline CGRect CGRectSafeValue(CGRect rect)

    Swift

    func CGRectSafeValue(_ rect: CGRect) -> CGRect
  • 创建一个像素对齐的CGRect

    Declaration

    Objective-C

    static inline CGRect CGRectFlatMake(CGFloat x, CGFloat y, CGFloat width,
                                        CGFloat height)

    Swift

    func CGRectFlatMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect
  • 对CGRect的x/y、width/height都调用一次flat,以保证像素对齐

    Declaration

    Objective-C

    static inline CGRect CGRectFlatted(CGRect rect)

    Swift

    func CGRectFlatted(_ rect: CGRect) -> CGRect
  • 计算目标点 targetPoint 围绕坐标点 coordinatePoint 通过 transform 之后此点的坐标

    Declaration

    Objective-C

    static inline CGPoint CGPointApplyAffineTransformWithCoordinatePoint(
        CGPoint coordinatePoint, CGPoint targetPoint, CGAffineTransform t)

    Swift

    func CGPointApplyAffineTransformWithCoordinatePoint(_ coordinatePoint: CGPoint, _ targetPoint: CGPoint, _ t: CGAffineTransform) -> CGPoint
  • 系统的 CGRectApplyAffineTransform 只会按照 anchorPoint 为 (0, 0) 的方式去计算,但通常情况下我们面对的是 UIView/CALayer,它们默认的 anchorPoint 为 (.5, .5),所以增加这个函数,在计算 transform 时可以考虑上 anchorPoint 的影响

    Declaration

    Objective-C

    static inline CGRect
    CGRectApplyAffineTransformWithAnchorPoint(CGRect rect, CGAffineTransform t,
                                              CGPoint anchorPoint)

    Swift

    func CGRectApplyAffineTransformWithAnchorPoint(_ rect: CGRect, _ t: CGAffineTransform, _ anchorPoint: CGPoint) -> CGRect
  • 为一个CGRect叠加scale计算

    Declaration

    Objective-C

    static inline CGRect CGRectApplyScale(CGRect rect, CGFloat scale)

    Swift

    func CGRectApplyScale(_ rect: CGRect, _ scale: CGFloat) -> CGRect
  • 计算view的水平居中,传入父view和子view的frame,返回子view在水平居中时的x值

    Declaration

    Objective-C

    static inline CGFloat
    CGRectGetMinXHorizontallyCenterInParentRect(CGRect parentRect, CGRect childRect)

    Swift

    func CGRectGetMinXHorizontallyCenterInParentRect(_ parentRect: CGRect, _ childRect: CGRect) -> CGFloat
  • 计算view的垂直居中,传入父view和子view的frame,返回子view在垂直居中时的y值

    Declaration

    Objective-C

    static inline CGFloat
    CGRectGetMinYVerticallyCenterInParentRect(CGRect parentRect, CGRect childRect)

    Swift

    func CGRectGetMinYVerticallyCenterInParentRect(_ parentRect: CGRect, _ childRect: CGRect) -> CGFloat
  • 返回值:同一个坐标系内,想要layoutingRect和已布局完成的referenceRect保持垂直居中时,layoutingRect的originY

    Declaration

    Objective-C

    static inline CGFloat CGRectGetMinYVerticallyCenter(CGRect referenceRect,
                                                        CGRect layoutingRect)

    Swift

    func CGRectGetMinYVerticallyCenter(_ referenceRect: CGRect, _ layoutingRect: CGRect) -> CGFloat
  • 返回值:同一个坐标系内,想要layoutingRect和已布局完成的referenceRect保持水平居中时,layoutingRect的originX

    Declaration

    Objective-C

    static inline CGFloat CGRectGetMinXHorizontallyCenter(CGRect referenceRect,
                                                          CGRect layoutingRect)

    Swift

    func CGRectGetMinXHorizontallyCenter(_ referenceRect: CGRect, _ layoutingRect: CGRect) -> CGFloat
  • 为给定的rect往内部缩小insets的大小(系统那个方法的命名太难联想了,所以定义了一个新函数)

    Declaration

    Objective-C

    static inline CGRect CGRectInsetEdges(CGRect rect, UIEdgeInsets insets)

    Swift

    func CGRectInsetEdges(_ rect: CGRect, _ insets: UIEdgeInsets) -> CGRect
  • 传入size,返回一个x/y为0的CGRect

    Declaration

    Objective-C

    static inline CGRect CGRectMakeWithSize(CGSize size)

    Swift

    func CGRectMakeWithSize(_ size: CGSize) -> CGRect
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGRect
    CGRectFloatTop(CGRect rect, CGFloat top) {
        rect.origin.y = top;
        return rect;
    }

    Swift

    func CGRectFloatTop(_ rect: CGRect, _ top: CGFloat) -> CGRect
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGRect
    CGRectFloatBottom(CGRect rect, CGFloat bottom) {
        rect.origin.y = bottom - CGRectGetHeight(rect);
        return rect;
    }

    Swift

    func CGRectFloatBottom(_ rect: CGRect, _ bottom: CGFloat) -> CGRect
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGRect
    CGRectFloatRight(CGRect rect, CGFloat right) {
        rect.origin.x = right - CGRectGetWidth(rect);
        return rect;
    }

    Swift

    func CGRectFloatRight(_ rect: CGRect, _ right: CGFloat) -> CGRect
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGRect
    CGRectFloatLeft(CGRect rect, CGFloat left) {
        rect.origin.x = left;
        return rect;
    }

    Swift

    func CGRectFloatLeft(_ rect: CGRect, _ left: CGFloat) -> CGRect
  • 保持rect的左边缘不变,改变其宽度,使右边缘靠在right上

    Declaration

    Objective-C

    static inline CGRect CGRectLimitRight(CGRect rect, CGFloat rightLimit)

    Swift

    func CGRectLimitRight(_ rect: CGRect, _ rightLimit: CGFloat) -> CGRect
  • 保持rect右边缘不变,改变其宽度和origin.x,使其左边缘靠在left上。只适合那种右边缘不动的view 先改变origin.x,让其靠在offset上 再改变size.width,减少同样的宽度,以抵消改变origin.x带来的view移动,从而保证view的右边缘是不动的

    Declaration

    Objective-C

    static inline CGRect CGRectLimitLeft(CGRect rect, CGFloat leftLimit)

    Swift

    func CGRectLimitLeft(_ rect: CGRect, _ leftLimit: CGFloat) -> CGRect
  • 限制rect的宽度,超过最大宽度则截断,否则保持rect的宽度不变

    Declaration

    Objective-C

    static inline CGRect CGRectLimitMaxWidth(CGRect rect, CGFloat maxWidth)

    Swift

    func CGRectLimitMaxWidth(_ rect: CGRect, _ maxWidth: CGFloat) -> CGRect
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGRect
    CGRectSetX(CGRect rect, CGFloat x) {
        rect.origin.x = flat(x);
        return rect;
    }

    Swift

    func CGRectSetX(_ rect: CGRect, _ x: CGFloat) -> CGRect
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGRect
    CGRectSetY(CGRect rect, CGFloat y) {
        rect.origin.y = flat(y);
        return rect;
    }

    Swift

    func CGRectSetY(_ rect: CGRect, _ y: CGFloat) -> CGRect
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGRect
    CGRectSetXY(CGRect rect, CGFloat x, CGFloat y) {
        rect.origin.x = flat(x);
        rect.origin.y = flat(y);
        return rect;
    }

    Swift

    func CGRectSetXY(_ rect: CGRect, _ x: CGFloat, _ y: CGFloat) -> CGRect
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGRect
    CGRectSetWidth(CGRect rect, CGFloat width) {
        if (width < 0) {
            return rect;
        }
        rect.size.width = flat(width);
        return rect;
    }

    Swift

    func CGRectSetWidth(_ rect: CGRect, _ width: CGFloat) -> CGRect
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGRect
    CGRectSetHeight(CGRect rect, CGFloat height) {
        if (height < 0) {
            return rect;
        }
        rect.size.height = flat(height);
        return rect;
    }

    Swift

    func CGRectSetHeight(_ rect: CGRect, _ height: CGFloat) -> CGRect
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGRect
    CGRectSetSize(CGRect rect, CGSize size) {
        rect.size = CGSizeFlatted(size);
        return rect;
    }

    Swift

    func CGRectSetSize(_ rect: CGRect, _ size: CGSize) -> CGRect
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGRect
    CGRectToFixed(CGRect rect, NSUInteger precision) {
        CGRect result = CGRectMake(CGFloatToFixed(CGRectGetMinX(rect), precision),
                                   CGFloatToFixed(CGRectGetMinY(rect), precision),
                                   CGFloatToFixed(CGRectGetWidth(rect), precision),
                                   CGFloatToFixed(CGRectGetHeight(rect), precision));
        return result;
    }

    Swift

    func CGRectToFixed(_ rect: CGRect, _ precision: UInt) -> CGRect
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE CGRect
    CGRectRemoveFloatMin(CGRect rect) {
        CGRect result = CGRectMake(removeFloatMin(CGRectGetMinX(rect)),
                                   removeFloatMin(CGRectGetMinY(rect)),
                                   removeFloatMin(CGRectGetWidth(rect)),
                                   removeFloatMin(CGRectGetHeight(rect)));
        return result;
    }

    Swift

    func CGRectRemoveFloatMin(_ rect: CGRect) -> CGRect
  • outerRange 是否包含了 innerRange

    Declaration

    Objective-C

    static inline BOOL NSContainingRanges(NSRange outerRange, NSRange innerRange)

    Swift

    func NSContainingRanges(_ outerRange: NSRange, _ innerRange: NSRange) -> Bool

Method

  • Undocumented

    Declaration

    Objective-C

    CG_INLINE BOOL
    HasOverrideSuperclassMethod(Class targetClass, SEL targetSelector) {
        Method method = class_getInstanceMethod(targetClass, targetSelector);
        if (!method) return NO;
        
        Method methodOfSuperclass = class_getInstanceMethod(class_getSuperclass(targetClass), targetSelector);
        if (!methodOfSuperclass) return YES;
        
        return method != methodOfSuperclass;
    }

    Swift

    func HasOverrideSuperclassMethod(_ targetClass: AnyClass!, _ targetSelector: Selector!) -> Bool
  • 如果 fromClass 里存在 originSelector,则这个函数会将 fromClass 里的 originSelector 与 toClass 里的 newSelector 交换实现。 如果 fromClass 里不存在 originSelecotr,则这个函数会为 fromClass 增加方法 originSelector,并且该方法会使用 toClass 的 newSelector 方法的实现,而 toClass 的 newSelector 方法的实现则会被替换为空内容

    Warning

    注意如果 fromClass 里的 originSelector 是继承自父类并且 fromClass 也没有重写这个方法,这会导致实际上被替换的是父类,然后父类及父类的所有子类(也即 fromClass 的兄弟类)也受影响,因此使用时请谨记这一点。因此建议使用 OverrideImplementation 系列的方法去替换,尽量避免使用 ExchangeImplementations。

    Declaration

    Objective-C

    static inline BOOL ExchangeImplementationsInTwoClasses(Class _fromClass,
                                                           SEL _originSelector,
                                                           Class _toClass,
                                                           SEL _newSelector)

    Swift

    func ExchangeImplementationsInTwoClasses(_ _fromClass: AnyClass!, _ _originSelector: Selector!, _ _toClass: AnyClass!, _ _newSelector: Selector!) -> Bool

    Parameters

    _fromClass

    要被替换的 class,不能为空

    _originSelector

    要被替换的 class 的 selector,可为空,为空则相当于为 fromClass 新增这个方法

    _toClass

    要拿这个 class 的方法来替换

    _newSelector

    要拿 toClass 里的这个方法来替换 originSelector

    Return Value

    是否成功替换(或增加)

  • 交换同一个 class 里的 originSelector 和 newSelector 的实现,如果原本不存在 originSelector,则相当于给 class 新增一个叫做 originSelector 的方法

    Declaration

    Objective-C

    static inline BOOL ExchangeImplementations(Class _class, SEL _originSelector,
                                               SEL _newSelector)

    Swift

    func ExchangeImplementations(_ _class: AnyClass!, _ _originSelector: Selector!, _ _newSelector: Selector!) -> Bool
  • 用 block 重写某个 class 的指定方法

    Declaration

    Objective-C

    static inline BOOL
    OverrideImplementation(Class targetClass, SEL targetSelector,
                           id (^implementationBlock)(Class, SEL, IMP (^)(void)))

    Swift

    func OverrideImplementation(_ targetClass: AnyClass!, _ targetSelector: Selector!, _ implementationBlock: ((AnyClass?, Selector?, (() -> IMP?)?) -> Any?)!) -> Bool

    Parameters

    targetClass

    要重写的 class

    targetSelector

    要重写的 class 里的实例方法,注意如果该方法不存在于 targetClass 里,则什么都不做

    implementationBlock

    该 block 必须返回一个 block,返回的 block 将被当成 targetSelector 的新实现,所以要在内部自己处理对 super 的调用,以及对当前调用方法的 self 的 class 的保护判断(因为如果 targetClass 的 targetSelector 是继承自父类的,targetClass 内部并没有重写这个方法,则我们这个函数最终重写的其实是父类的 targetSelector,所以会产生预期之外的 class 的影响,例如 targetClass 传进来 UIButton.class,则最终可能会影响到 UIView.class),implementationBlock 的参数里第一个为你要修改的 class,也即等同于 targetClass,第二个参数为你要修改的 selector,也即等同于 targetSelector,第三个参数是一个 block,用于获取 targetSelector 原本的实现,由于 IMP 可以直接当成 C 函数调用,所以可利用它来实现“调用 super”的效果,但由于 targetSelector 的参数个数、参数类型、返回值类型,都会影响 IMP 的调用写法,所以这个调用只能由业务自己写。

  • 用 block 重写某个 class 的某个无参数且返回值为 void 的方法,会自动在调用 block 之前先调用该方法原本的实现。

    Declaration

    Objective-C

    static inline BOOL ExtendImplementationOfVoidMethodWithoutArguments(
        Class targetClass, SEL targetSelector,
        void (^implementationBlock)(__kindof NSObject *))

    Swift

    func ExtendImplementationOfVoidMethodWithoutArguments(_ targetClass: AnyClass!, _ targetSelector: Selector!, _ implementationBlock: ((NSObject?) -> Void)!) -> Bool

    Parameters

    targetClass

    要重写的 class

    targetSelector

    要重写的 class 里的实例方法,注意如果该方法不存在于 targetClass 里,则什么都不做,注意该方法必须无参数,返回值为 void

    implementationBlock

    targetSelector 的自定义实现,直接将你的实现写进去即可,不需要管 super 的调用。参数 selfObject 代表当前正在调用这个方法的对象,也即 self 指针。

Ivar

  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Char, char)

    Swift

    func isCharTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Char, char)

    Swift

    func isCharIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Int, int)

    Swift

    func isIntIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Int, int)

    Swift

    func isIntTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Short, short)

    Swift

    func isShortIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Short, short)

    Swift

    func isShortTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Long, long)

    Swift

    func isLongTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Long, long)

    Swift

    func isLongIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(LongLong, long long)

    Swift

    func isLongLongIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(LongLong, long long)

    Swift

    func isLongLongTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(NSInteger, NSInteger)

    Swift

    func isNSIntegerTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(NSInteger, NSInteger)

    Swift

    func isNSIntegerIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(UnsignedChar, unsigned char)

    Swift

    func isUnsignedCharTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(UnsignedChar, unsigned char)

    Swift

    func isUnsignedCharIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(UnsignedInt, unsigned int)

    Swift

    func isUnsignedIntTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(UnsignedInt, unsigned int)

    Swift

    func isUnsignedIntIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(UnsignedShort, unsigned short)

    Swift

    func isUnsignedShortIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(UnsignedShort, unsigned short)

    Swift

    func isUnsignedShortTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(UnsignedLong, unsigned long)

    Swift

    func isUnsignedLongTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(UnsignedLong, unsigned long)

    Swift

    func isUnsignedLongIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(UnsignedLongLong, unsigned long long)

    Swift

    func isUnsignedLongLongIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(UnsignedLongLong, unsigned long long)

    Swift

    func isUnsignedLongLongTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(NSUInteger, NSUInteger)

    Swift

    func isNSUIntegerTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(NSUInteger, NSUInteger)

    Swift

    func isNSUIntegerIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Float, float)

    Swift

    func isFloatTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Float, float)

    Swift

    func isFloatIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Double, double)

    Swift

    func isDoubleIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Double, double)

    Swift

    func isDoubleTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(CGFloat, CGFloat)

    Swift

    func isCGFloatTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(CGFloat, CGFloat)

    Swift

    func isCGFloatIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(BOOL, BOOL)

    Swift

    func isBOOLIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(BOOL, BOOL)

    Swift

    func isBOOLTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Void, void)

    Swift

    func isVoidIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Void, void)

    Swift

    func isVoidTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Character, char *)

    Swift

    func isCharacterTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Character, char *)

    Swift

    func isCharacterIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Object, id)

    Swift

    func isObjectTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Object, id)

    Swift

    func isObjectIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Class, Class)

    Swift

    func isClassTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Class, Class)

    Swift

    func isClassIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Selector, SEL)

    Swift

    func isSelectorIvar(_ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUITypeEncodingDetectorGenerator(Selector, SEL)

    Swift

    func isSelectorTypeEncoding(_ typeEncoding: UnsafePointer<Int8>!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUIGetIvarValueGenerator(Char, char)

    Swift

    func getCharIvarValue(_ object: Any!, _ ivar: Ivar!) -> Int8
  • Undocumented

    Declaration

    Objective-C

    _QMUIGetIvarValueGenerator(Int, int)

    Swift

    func getIntIvarValue(_ object: Any!, _ ivar: Ivar!) -> Int32
  • Undocumented

    Declaration

    Objective-C

    _QMUIGetIvarValueGenerator(Short, short)

    Swift

    func getShortIvarValue(_ object: Any!, _ ivar: Ivar!) -> Int16
  • Undocumented

    Declaration

    Objective-C

    _QMUIGetIvarValueGenerator(Long, long)

    Swift

    func getLongIvarValue(_ object: Any!, _ ivar: Ivar!) -> Int
  • Undocumented

    Declaration

    Objective-C

    _QMUIGetIvarValueGenerator(LongLong, long long)

    Swift

    func getLongLongIvarValue(_ object: Any!, _ ivar: Ivar!) -> Int64
  • Undocumented

    Declaration

    Objective-C

    _QMUIGetIvarValueGenerator(UnsignedChar, unsigned char)

    Swift

    func getUnsignedCharIvarValue(_ object: Any!, _ ivar: Ivar!) -> UInt8
  • Undocumented

    Declaration

    Objective-C

    _QMUIGetIvarValueGenerator(UnsignedInt, unsigned int)

    Swift

    func getUnsignedIntIvarValue(_ object: Any!, _ ivar: Ivar!) -> UInt32
  • Undocumented

    Declaration

    Objective-C

    _QMUIGetIvarValueGenerator(UnsignedShort, unsigned short)

    Swift

    func getUnsignedShortIvarValue(_ object: Any!, _ ivar: Ivar!) -> UInt16
  • Undocumented

    Declaration

    Objective-C

    _QMUIGetIvarValueGenerator(UnsignedLong, unsigned long)

    Swift

    func getUnsignedLongIvarValue(_ object: Any!, _ ivar: Ivar!) -> UInt
  • Undocumented

    Declaration

    Objective-C

    _QMUIGetIvarValueGenerator(UnsignedLongLong, unsigned long long)

    Swift

    func getUnsignedLongLongIvarValue(_ object: Any!, _ ivar: Ivar!) -> UInt64
  • Undocumented

    Declaration

    Objective-C

    _QMUIGetIvarValueGenerator(Float, float)

    Swift

    func getFloatIvarValue(_ object: Any!, _ ivar: Ivar!) -> Float
  • Undocumented

    Declaration

    Objective-C

    _QMUIGetIvarValueGenerator(Double, double)

    Swift

    func getDoubleIvarValue(_ object: Any!, _ ivar: Ivar!) -> Double
  • Undocumented

    Declaration

    Objective-C

    _QMUIGetIvarValueGenerator(BOOL, BOOL)

    Swift

    func getBOOLIvarValue(_ object: Any!, _ ivar: Ivar!) -> Bool
  • Undocumented

    Declaration

    Objective-C

    _QMUIGetIvarValueGenerator(Character, char *)

    Swift

    func getCharacterIvarValue(_ object: Any!, _ ivar: Ivar!) -> UnsafeMutablePointer<Int8>!
  • Undocumented

    Declaration

    Objective-C

    _QMUIGetIvarValueGenerator(Selector, SEL)

    Swift

    func getSelectorIvarValue(_ object: Any!, _ ivar: Ivar!) -> Selector!
  • Undocumented

    Declaration

    Objective-C

    CG_INLINE id getObjectIvarValue(id object, Ivar ivar) {
        return object_getIvar(object, ivar);
    }

    Swift

    func getObjectIvarValue(_ object: Any!, _ ivar: Ivar!) -> Any!

Mach-O

  • 获取业务项目的所有 class

    例如:

    classref_t *classes = nil;
    int count = qmui_getProjectClassList(&classes);
    Class class = (__bridge Class)classes[0];
    

    Declaration

    Objective-C

    extern int qmui_getProjectClassList(classref_t **classes)

    Swift

    func qmui_getProjectClassList(_ classes: UnsafeMutablePointer<UnsafeMutablePointer<classref_t?>?>!) -> Int32

    Parameters

    classes

    传入 classref_t 变量的指针,会填充结果到里面,然后可以用下标访问。如果只是为了得到总数,可传入 NULL。

    Return Value

    class 的总数