2016-03-31 21 views
1

Ben 3D Touch gözetleme ve pop önizleme gömülüdür UIScrollView swizzle çalışıyorum. (Ben Ortaya uygulaması aracılığıyla bir UIScrollView biliyorum.) Ben kullanıcı bu Tomardaki parmaklarını hareket ne zaman bilmek istiyorumUIScrollView ile 3D touch peek pop ile düzgün bir şekilde nasıl açılır?

3B dokunma önizlemesini görüntüleyin/görüntüleyin.

ben aşağıdaki gibi swizzling çalıştı:

+ (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"); 

} 

Ama ekran boyunca parmağımı kaymasını aramaların yüzlerce olmalıdır zaman sadece "evet" ya da iki kez çağırır.

Yanlış mı takıldım?

cevap

0

Kaydırma görünümünün kendisinin "ayarlayıcı" olarak adlandırıldığından emin olmayacağından emin değilim.

contentOffset özelliğindeki KVO aracılığıyla kaydırma görünümünde "yüzen" görünüm oluşturdum ve beklendiği gibi çağrıldı.

 /** 
     * 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); 
    } 
} 

ama

başvuru için böyle swizzling ediyorum:

+(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]; 
} 
Sen durumda aynı mekanizmayı kullanmak mümkün olabilir
İlgili konular