[原创]修正DejalActivityView在iOS8之前系统上存在的Bug

  DejalActivityView是国外的第三方库,可自定义文本内容和文本长度的菊花转加载指示器效果。该第三方库与其它hud存在不同,能够遮盖键盘;可以自定义遮盖NavigationBar或不遮盖NavigationBar,能够在status bar显示activity view等效果。该库github地址:https://github.com/Dejal/DejalActivityView

  DejalActivityView在iOS 8 之前的系统上存在bug,今天使用github上的最新版本存在同样的bug。我现在在给深圳一家智能家居公司zyyzn开发iPad版本的app,app中的加载提示使用了该第三方库。开发的app 是横版显示的,这时问题就出现了,DejalActivityView在iOS 7.1 系统上,当app为横版时,DejalActivityView提示框不能跟随app界面一致显示为横屏,如下图:

[DejalBezelActivityView activityViewForView:[UIApplication sharedApplication].keyWindow withLabel:@"正在登录,请稍后..."];

  上图中的提示效果与我期望的效果不一致,这时怎么办?是使用另外一套第三方库来替代它,比如MBProgressHUD,还是耐心去修改?因为我的iPad版app是在iPhone 版基础上修改的,iPhone版是竖版,iPad要做成横版,要是替换一套第三方提示库,工作量太大。还是耐心修改DejalActivityView吧。

  在DejalActivityView.m中,@implementation DejalBezelActivityView 的实现中找到 - (void)layoutSubviews,在该方法的末尾添加

 [self addObserver];
 [self onDeviceOrientationChange:nil];

具体如下:

- (void)layoutSubviews;
{
    // If we‘re animating a transform, don‘t lay out now, as can‘t use the frame property when transforming:
    if (!CGAffineTransformIsIdentity(self.borderView.transform))
        return;

    self.frame = [self enclosingFrame];

    ......
    ......  这些代码就不贴出来了,占位置
    ......

    // Calculate the position of the label: horizontally centered and near the bottom of the border view:
    CGRect labelFrame = self.activityLabel.frame;
    labelFrame.origin.x = floor(0.5 * (borderFrame.size.width - labelFrame.size.width));
    labelFrame.origin.y = borderFrame.size.height - labelFrame.size.height - 10.0;
    self.activityLabel.frame = labelFrame;

    [self addObserver];
    [self onDeviceOrientationChange:nil];
}

  addObserver方法的实现:

#pragma mark --
#pragma mark -- (1) - 解决该第三方库在iOS 8 之前的系统上,APP 横屏时不能跟随界面横着显示的bug,written by sunminmin 1/30/2015
// 接受状态栏变化通知中心监听状态栏的变化
- (void)addObserver
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onDeviceOrientationChange:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
}

  onDeviceOrientationChange方法实现:

// 根据监测得到的设备的方向旋转View
- (void)onDeviceOrientationChange:(id)sender
{
    if ([[UIDevice currentDevice] systemVersion].floatValue < 8.0) {
        UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
        if (orientation == UIInterfaceOrientationLandscapeLeft) {
            self.activityIndicator.superview.transform = CGAffineTransformMakeRotation(- M_PI_2);
        }
        if (orientation == UIInterfaceOrientationLandscapeRight) {
            self.activityIndicator.superview.transform = CGAffineTransformMakeRotation(M_PI_2);
        }
    }
}

  @implementation DejalBezelActivityView 的 layoutSubviews方法中注册了监听者,那就需要在 dealloc方法中移除监听:

// 在dealloc中移除监听
- (void)dealloc
{
    [self removeObserver];
}

// 移除状态栏变化通知中心的监听
- (void)removeObserver
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
}

  做好上面的修改之后,DejalActivityView在iOS 7的设备上显示提示就正常了,但是还不够完美,为什么?因为在弹出DejalActivityView时,DejalActivityView会先旋转90度才正确显示为横版,这影响了效果,还不是我需要的效果。通过DejalActivityView的显示过程,我判断问题出现在它的动画效果上,那我就去找它的动画实现方法,哦,找到了,就是 - (void)animateShow;此时我需要在该方法中修改,问题出在iOS 8之前的系统上,首先就需要做系统版本判断,其次就是修改动画效果咯。

- (void)animateShow;
{
    self.alpha = 0.0;
    self.borderView.transform = CGAffineTransformMakeScale(3.0, 3.0);

	[UIView beginAnimations:nil context:nil];
//	[UIView setAnimationDuration:5.0];            // Uncomment to see the animation in slow motion

    self.borderView.transform = CGAffineTransformIdentity;
    self.alpha = 1.0;

	[UIView commitAnimations];
}

  在上面的 animateShow方法中,添加如下代码,具体实现为:

- (void)animateShow;
{
    if ([[UIDevice currentDevice] systemVersion].floatValue >= 8.0) {
        self.alpha = 0.0;
        self.borderView.transform = CGAffineTransformMakeScale(3.0, 3.0);

        [UIView beginAnimations:nil context:nil];
        //	[UIView setAnimationDuration:5.0];            // Uncomment to see the animation in slow motion

        self.borderView.transform = CGAffineTransformIdentity;
        self.alpha = 1.0;

        [UIView commitAnimations];
    } else {
#pragma mark --
#pragma mark -- (2) - 解决该第三方库在iOS 8 之前的系统上,APP 横屏时不能跟随界面横着显示的bug,written by sunminmin 1/30/2015
        self.alpha = 0.0;
        [UIView beginAnimations:nil context:nil];
        self.alpha = 1.0;
        [UIView commitAnimations];
    }
}

  到现在为止,那就修改好了,在iOS 7的设备上再次执行下面的代码,预期的效果出来了,如下图:

[DejalBezelActivityView activityViewForView:[UIApplication sharedApplication].keyWindow withLabel:@"正在登录,请稍后..."];

修改后的DejalActivityView库的下载地址为: http://pan.baidu.com/s/1mgp8Aqk  百度网盘

时间: 2024-11-09 02:43:07

[原创]修正DejalActivityView在iOS8之前系统上存在的Bug的相关文章

[原创]jQuery的this和$(this)

网上有很多关于jQuery的this和$(this)的介绍,大多数只是理清了this和$(this)的指向,其实它是有应用场所的,不能一概而论在jQuery调用成员函数时,this就是指向dom对象. $(this)指向jQuery对象是无可厚非的,但this就是指向dom对象,这个是因为jQuery做了特殊的处理. 在创建dom的jQuery对象时,jQuery不仅仅为dom创建一个jQuery对象,而且还将dom存储在所创建对象的数组中. elem = document.getElement

[原创]对结对编程的感受

本周出于老师作业的要求,本周体验了一下结对编程,刚开始还觉得这没什么稀奇,一样都是编程嘛,体验了之后才知道结对编程的优点. 结对编程,从字面上讲,就是两个人一起编程.而1+1=?这个问题一直是一个疑问,可以大于2,可以等于2,可以小于2,从这次编程经历看来,结对编程(至少是我们这次结对编程),这个式子的答案应该是大于2. 关于结对编程的许多优点和好处,在邹欣老师的博客中http://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html都可以看到

[原创]国外iOS开发资源

这个网站 http://www.scoop.it/t/pandalit 的iOS开发内容挺丰富的,以前自己都是拿网上的第三方库来达到自己所希望获得的效果,看了看这网站的内容,我觉得我有必要去写些自己想要的code效果了.

蓄水池算法介绍和证明[原创]

蓄水池算法要解决的问题就是在不知道流入数据量多少的情况下,依旧可以随机从这些数中选取K个,乍一听好神奇,其实分析一下背后的概率知识,思想还是很简单的,相信看完我的介绍和证明,你也会觉得很简单. 假设要求随机选择K个元素,假设一共流入的元素有n个. 首先数组a[0...k-1]表示最后返回的结果,最开始流入的k个元素依次放入a[0...k-1]中: 那么从第k+1到第n个元素每一次都有可能把数组a中的元素踢走换成自己,假设现在流入了第i个元素,搞个随机数生成器,pos=rand()%i,如果pos

[原创]收集比较有意思的iOS开源项目

IOS研究之美女图片采集器实现(源码+解析)详解(四十七) IOS研究之智能聊天机器人实现(源码+解析)详解(四十八)

[原创]iOS 简化冗余代码

正在给深圳某家智能家居开发iPad版本,在已经存在的iPhone版上修改,该app的界面采用的是xib.xib相比代码来写界面,快速高效,但是可维护性和可读性太差.言归正传,看到这些代码后,我的心情很复杂. 任何一门编程领域,任何人都可以参与,就拿iOS开发来说,有的人写出的代码是能执行,但不仅仅要求是能执行,当项目的功能不断增加时,不整洁的编写风格会让人看着想吐,就不用谈什么可维护性了,简直是一团糟. else if (devTypeID==13||devTypeID==14) { XRDim

[原创]mac终端前面的计算机名怎么改??

1.修改-之前的名称 mac环境,系统 OS X Yisemite,打开终端, 执行下面命令“Tmp”是你想要改的电脑名称 sudo scutil --set HostName Tmp 执行前,执行后对比: 成功修改,大功告成!(ps:执行过后命令,需要强行退出终端,重新打开就好了) 2.如果想修改-之后的名称,那就修改当前管理员名称即可:

iOS第三方库汇总[转载]

iOS第三方库汇总[转载] 字数2179 阅读334 评论0 喜欢29 简介 此文用于总结,本人使用过或者收藏过的Github第三方类库,以便日后查阅,也便他人借鉴. 资料整理中不定期更新... 开源项目 CodeHub browse and maintain your GitHub repositories on any iOS device! Open-Source iOS Apps 开源iOS apps列表 APP相关 iVersion 提示版本更新 BonMot 字体相关的库,设置字体样

[Ruby on Rails系列]4、专题:Rails应用的国际化[i18n]

1. 什么是internationalization(i18n)? 国际化,英文简称i18n,按照维基百科的定义:国际化是指在设计软件,将软件与特定语言及地区脱钩的过程.当软件被移植到不同的语言及地区时,软件本身不用做内部工程上的改变或修正. 当然,官方的定义总是十分高大上.实际上,今天我们要做的并没有那么复杂.任务是为上次的系列3里的Web站点提供多语言支持.比如上次是英语网站,这次我们可以根据用户地点自动提供中文网站或其他语言网站. 2.如何实现i18n? 2.1 Step1: 登录Clou