Как правильно настроить UIScrollView с помощью 3D Touch Peek Pop?
Я пытаюсь изобразить UIScrollView, в который встроен предварительный и всплывающий предварительный просмотр 3D Touch. (Я знаю, что это UIScrollView через приложение Reveal).
Я хочу знать, когда пользователь перемещает палец в этом представлении прокрутки / в 3D-предпросмотре касания.
Я попытался выпить это следующим образом:
+ (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");
}
Но он вызывает "да" только один или два раза, когда должны быть сотни вызовов, когда я провожу пальцем по экрану.
Неужели я не прав?
1 ответ
Я не уверен, что само представление прокрутки вызывает "установщик", поэтому вы не обязательно получите обратный вызов.
Я создал "плавающее" представление в scrollview через KVO для свойства contentOffset, и оно вызывается, как и ожидалось. Вы можете использовать тот же механизм в вашем случае:
/**
* 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);
}
}
но для справки я извергаю вот так:
+(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];
}