how to override/swizzle a method of a private class in runtime objective-c?

后端 未结 2 806
温柔的废话
温柔的废话 2021-01-07 04:37

To give a bit of context of why I\'m asking this: basically I would like to change the location of the myLocationButton of the google map on iOS. So I first fet

2条回答
  •  悲哀的现实
    2021-01-07 05:33

    this did it.. i'm not sure if this counts as an actual answer since i just got around the problem by simply calling [self layoutIfNeeded] instead of [self layoutSubviews]

    void _autolayout_replacementLayoutSubviews(id self, SEL _cmd)
    {
        // calling super
        struct objc_super superTarget;
        superTarget.receiver = self;
        superTarget.super_class = class_getSuperclass(object_getClass(self));
        objc_msgSendSuper(&superTarget, @selector(layoutSubviews));
    
        // to get around calling layoutSubviews and having
        // a recursive call
        [self layoutIfNeeded];
    
        objc_msgSendSuper(&superTarget, @selector(layoutSubviews));
    }
    
    - (void)replaceGMSUISettingsViewImplementation
    {
        class_addMethod(NSClassFromString(@"GMSUISettingsView"), @selector(_autolayout_replacementLayoutSubviews), (IMP)_autolayout_replacementLayoutSubviews, "v@:");
    
        Method existing = class_getInstanceMethod(NSClassFromString(@"GMSUISettingsView"), @selector(layoutSubviews));
        Method new = class_getInstanceMethod(NSClassFromString(@"GMSUISettingsView"), @selector(_autolayout_replacementLayoutSubviews));
    
        method_exchangeImplementations(existing, new);
    }
    

提交回复
热议问题