2016-03-31 13 views
1

Ich versuche, die UIScrollView, die 3D-Touch den peek und Pop Vorschau in eingebettet ist zu swizzle. (Ich weiß, dass es sich um eine UIScrollView über die App Reveal ist.)Wie UIScrollView mit 3D-Touch-Peek-Pop richtig swizzle?

Ich möchte wissen, wenn der Benutzer auf dieser Rolle ihre Finger bewegt Ansicht/auf der 3D-Touch-Vorschau.

Ich versuchte es Swizzling wie folgt:

+ (void)load { 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     Class class = [self class]; 

     SEL originalSelector = @selector(setContentOffset:); 
     SEL swizzledSelector = @selector(xxx_setContentOffset:); 

     Method originalMethod = class_getInstanceMethod(class, originalSelector); 
     Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); 

     BOOL didAddMethod = 
     class_addMethod(class, 
         originalSelector, 
         method_getImplementation(swizzledMethod), 
         method_getTypeEncoding(swizzledMethod)); 

     if (didAddMethod) { 
      class_replaceMethod(class, 
           swizzledSelector, 
           method_getImplementation(originalMethod), 
           method_getTypeEncoding(originalMethod)); 
     } else { 
      method_exchangeImplementations(originalMethod, swizzledMethod); 
     } 
    }); 
} 

#pragma mark - Method Swizzling 

- (void)xxx_setContentOffset:(CGPoint)offset { 
    [self xxx_setContentOffset:offset]; 

    NSLog(@"yes"); 

} 

Aber es nennt nur „ja“ ein- oder zweimal, wenn es Hunderte von Anrufen von Schiebe meine Finger über den Bildschirm sein sollte.

Wechsle ich das falsch?

Antwort

0

Ich bin mir nicht sicher, dass die Scroll-Ansicht selbst den "Setter" dafür nennt, Sie werden nicht unbedingt den Callback bekommen.

Ich erstellte eine "schwebende" Ansicht in der Bildschirmansicht durch KVO auf der ContentOffset-Eigenschaft und es wird wie erwartet aufgerufen. Sie können den gleichen Mechanismus in Ihrem Fall verwenden können:

 /** 
     * We are using KVO to offset the background image view 
     */ 

     [self addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil]; 

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { 
    if ([keyPath isEqualToString:@"contentOffset"]) { 
     _bgImageView.frame = CGRectMake(self.contentOffset.x,0, self.frame.size.width, self.frame.size.height); 
    } 
} 

aber als Referenz ich so bin Swizzling:

+(void)load { 
    NSArray *selectors = @[NSStringFromSelector(@selector(setText:)),...]; 

    for (NSString *name in selectors) { 
     SEL originalSelector = NSSelectorFromString(name); 
     SEL swizzledSelector = NSSelectorFromString([NSString stringWithFormat:@"iio_swizzled_%@",name]); 
     Method originalMethod = class_getInstanceMethod(self, originalSelector); 
     Method swizzledMethod = class_getInstanceMethod(self, swizzledSelector); 
     class_addMethod(self, 
         originalSelector, 
         class_getMethodImplementation(self, originalSelector), 
         method_getTypeEncoding(originalMethod)); 
     class_addMethod(self, 
         swizzledSelector, 
         class_getMethodImplementation(self, swizzledSelector), 
         method_getTypeEncoding(swizzledMethod)); 
     method_exchangeImplementations(originalMethod, swizzledMethod); 
    } 

} 

-(void)iio_swizzled_setText:(NSString *)text { 
    ... do stuff 
    // and if needed to call the original 
    [self iio_swizzled_setText:text]; 
}