Castie!

正态分布, 优劣伴生

北冥有鱼,其名为鲲(kūn)。鲲之大,不知其几千里也;化而为鸟,其名为鹏。鹏之背,不知其几千里也;怒而飞,其翼若垂天之云。是鸟也,海运则将徙于南冥。南冥者,天池也。


北海若曰:“井鼃不可以语于海者,拘于虚也;夏虫不可以语于冰者,笃于时也;曲士不可以语于道者,束于教也。今尔出于崖涘,观于大海,乃知尔丑,尔将可与语大理矣。

iOS 5行代码搞定全屏Pop转场

最近在写论文阶段, 没有足够的精力来写技术分享, 再此说声抱歉, 不过我也会尽力挤出时间不定期为大家更新一些干货的!! 请大家继续关注!!

参考链接:

以下内容在上述文章基础上进行, 请事先查阅.

POP全屏转场

好了, 今天要分享的是5行代码实现全屏POP转场动画, 众所周知,iOS7后导航控制器默认自带了侧滑功能,当用户在界面的左边滑动的时候,就会有侧滑功能。导航控制器的view自带了滑动手势,只不过手势的触发范围只能在左边。当用户在界面左边拖动,就会触发滑动手势方法,并且有滑动返回功能,说明系统手势触发的方法已经实现了滑动返回功能

- (void)viewDidLoad {
    [super viewDidLoad];
    
    id target = self.interactivePopGestureRecognizer.delegate;
    UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:target action:@selector(handleNavigationTransition:)];
    pan.delegate = self;
    [self.view addGestureRecognizer:pan];
    [self.interactivePopGestureRecognizer setEnabled:NO];
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    return self.childViewControllers.count == 1 ? NO : YES;
}

我们只需要在SQNavigationController中添加一个全屏的滑动手势,调用系统自带滑动手势的target的action方法,利用系统实现的滑动返回功能,加上自己全屏滑动手势,就有全屏滑动功能了。

显示效果

Runtime 预防数组越界

我刚学习编程的时候有老师告诉我, 大约有90%的Crash来自于数组越界, 那如果解决了数组越界那就能够屏蔽90%的Crash 是不是很厉害!! 哈哈哈~~~ 但是我们怎么能够屏蔽越界呢??

大家都知道在数组越界就是objectAtIndex:这个方法的index超过了数组的count 然后就无情的Crash了, 最为粗暴的解决方法是在每一次objectAtIndex:时做下if判断, 的确有这么个习惯非常好,但是人总有遗忘的时候, 项目那么大不可能每次我都写把… 这时 我们想到了第二个办法 就是在NSArray的分类中写一个safeObjectAtIndex:以后所有调用数组下标,都使用这个方法, 期初看这的确是一个办法, 不过如果是在项目中期, 我怎么保证前面的都有使用这个方法呢? 还有如果使用array[index]这种coding suger的访问 根本就不可控啊!! 于是我们来学习最终的解决方案Runtime;

+ (void)load {

    SEL safeSel   = @selector(safeObjectAtIndex:);
    SEL unsafeSel = @selector(objectAtIndex:);
    
    Class class = NSClassFromString(@"__NSArrayI");

    Method safeMethod   = class_getInstanceMethod(class, safeSel);
    Method unsafeMethod = class_getInstanceMethod(class, unsafeSel);
    
    method_exchangeImplementations(unsafeMethod, safeMethod);
}

- (id)safeObjectAtIndex:(NSUInteger)index {

    if (index > (self.count - 1)) {
        NSAssert(NO, @"beyond the boundary");
        return nil;
    } else {
        return [self safeObjectAtIndex:index];
    }
}

Runtime也就是运行时, 是OC中消息机制msgSend的核心, 但是要讲Runtime真的涉及到的知识点太多, 一般实际应用场景有, 模型转字典, 分类加属性, 动态创建和获取等,JSPatch热修复也是基于Runtime实现的,今天我所分享个大家的用法是交换两个方法的实现来防止数组越界造成的崩溃!!

我们来分析上面的代码, 其实也没有什么好说的…</br> + (void)load方法是在创建分类的时候系统会自动调用的方法</br> SEL unsafeSel = @selector(objectAtIndex:) objc_selector结构体的详细定义没有在头文件中找到。方法的selector用于表示运行时方 法的名字。Objective-C在编译时,会依据每一个方法的名字、参数序列,生成一个唯一的整型标识(Int类型的地址),这个标识就是SEL。</br> Method unsafeMethod = class_getInstanceMethod(class, unsafeSel) 使用runtime方法拿到类中的方法</br> method_exchangeImplementations交换SEL对应的IMP实现

这样 我们就轻松愉快的防止了90%的Crash 是不是很牛逼!!!!

进一步联系我

好了 今天的分享也就结束了, 最近想换个环境找个新工作, 地点在上海, 有志同道合的朋友可以发我私信进一步联系!!


github 下载地址!!!

点击下方链接跳转!!

具体源码及SQExtension方法信息 请到github上进行下载! 喜欢的朋友送下小星星哟!!

最近的文章

Hybird 说说与Web交互的那些事儿

喵神100Tips的解读连载已经到了第十篇了, 是要好好敲一个Demo来巩固一下自己Swift的学习情况, 说来也巧, 前两天领导来问我能不能帮他做一个需求, 要求web页面调用app原生相册, 选择照片后将图片加载到web页面上. (同学们先想想怎样才能够实现这个需求), 这正是一个锻炼Swift3的机会, 绝对不能错过, 虽然一口答应, 但实际操作中还是有一些技术难点存在的, 在此与你分享.要做这个功能, 虽然对我来说还是Objective-C比较熟悉, 各项技术黑魔法都手到擒来,...…

移动开发继续阅读
更早的文章

iOS 狂霸酷炫拽之Button动效

上周的 引起热烈的反响, 小弟真的是受宠若惊, 还有些同学私信求更新的, 我特别推崇这种互帮互助的学习方式, 有利于共同学习, 好了开始今天的话题!参考链接: iOS 做好开工前的准备 iOS 集成Reveal UI调试利器 UI/UX 产品原型 从Axure开始 UI/UX 使用Ps 进行视觉设计 iOS 会跳舞的TabbarController iOS 超Easy实现 渐变导航栏以下内容在上述文章基础上进行, 请事先查阅.今天我们需要实现的功能是: 酷炫的Button...…

移动开发继续阅读