美文网首页着重记忆iOS DeveloperiOS 开发
简单实现下拉图片放大① - 全屏手势

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

作者: 马铃薯蜀黍 | 来源:发表于2016-09-05 15:17 被阅读885次
    工作变化.jpg

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

    github地址点我

    传送门 :

    Untitled3.gif

    1.全屏手势的实现

    #import <objc/runtime.h>
    
    • 运行时关联对象 添加属性
      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改变

    相关文章

      网友评论

        本文标题:简单实现下拉图片放大① - 全屏手势

        本文链接:https://www.haomeiwen.com/subject/lkurettx.html