简单实现下拉图片放大① - 全屏手势

简单实现下拉图片放大① - 全屏手势_第1张图片
工作变化.jpg

简单实现下拉图片放大
iOS - 面试时有力的谈资 运行时
你值得拥有,大神勿喷

github地址点我

传送门 :

  • 简单实现下拉图片放大① - 全屏手势
    简单实现下拉图片放大② - 单张图
    简单实现下拉图片放大③ - 定时器轮播图
    简单实现下拉图片放大④ + pageControl指示器
Untitled3.gif

1.全屏手势的实现

#import 
  • 运行时关联对象 添加属性
    UIPanGestureRecognizer交互手势
//懒加载 初始化UIPanGestureRecognizer交互手势
- (UIPanGestureRecognizer *)hm_popGestureRecognizer {
    UIPanGestureRecognizer *panGestureRecognizer = objc_getAssociatedObject(self, _cmd);
    
    if (panGestureRecognizer == nil) {
        panGestureRecognizer = [[UIPanGestureRecognizer alloc] init];
        panGestureRecognizer.maximumNumberOfTouches = 1;
        //分类中使用 运行时关联对象 添加属性
        objc_setAssociatedObject(self, _cmd, panGestureRecognizer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return panGestureRecognizer;
}
  • 判断是否手势的触发
- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer {
    //判断根视图的数量 是否可用使用手势返回
    if (self.navigationController.viewControllers.count <= 1) {
        return NO;
    }
    //KVC判断如果正在转场动画 取消手势
    if ([[self.navigationController valueForKey:@"_isTransitioning"] boolValue]) {
        return NO;
    }
    //判断手指移动方向
    CGPoint translation = [gestureRecognizer translationInView:gestureRecognizer.view];
    if (translation.x <= 0) {
        return NO;
    }
    
    return YES;
}
  • swizzledMethod (黑魔法)

使用运行时的交换方法 替换系统的 pushViewController:animated:方法

+ (void)load {
    
    Method originalMethod = class_getInstanceMethod([self class], @selector(pushViewController:animated:));
    Method swizzledMethod = class_getInstanceMethod([self class], @selector(hm_pushViewController:animated:));
    //替换系统的 pushViewController:animated:方法
    method_exchangeImplementations(originalMethod, swizzledMethod);
}
  • 实现自己的含手势的pop方法
- (void)hm_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    //在所有的交互手势中查找 如果没有就添加
    if (![self.interactivePopGestureRecognizer.view.gestureRecognizers containsObject:self.hm_popGestureRecognizer]) {
        [self.interactivePopGestureRecognizer.view addGestureRecognizer:self.hm_popGestureRecognizer];
        
        NSArray *targets = [self.interactivePopGestureRecognizer valueForKey:@"targets"];
        id internalTarget = [targets.firstObject valueForKey:@"target"];
        //拦截所有的系统手势方法 handleNavigationTransition
        SEL internalAction = NSSelectorFromString(@"handleNavigationTransition:");
        
        self.hm_popGestureRecognizer.delegate = [self hm_fullScreenPopGestureRecognizerDelegate];
        [self.hm_popGestureRecognizer addTarget:internalTarget action:internalAction];
        
        // 禁用系统的交互手势
        self.interactivePopGestureRecognizer.enabled = NO;
    }
    
    if (![self.viewControllers containsObject:viewController]) {
        [self hm_pushViewController:viewController animated:animated];
    }
}

获取下面内容 请点击上面链接
简单实现下拉图片放大②

  • 下拉放大
  • 上滑图片渐变消失
  • 状态栏的颜色根据图片alpha改变

你可能感兴趣的:(简单实现下拉图片放大① - 全屏手势)