文档章节

iOS app开发中常用技巧

IamOkay
 IamOkay
发布于 2016/05/21 20:35
字数 742
阅读 94
收藏 2

1.退出App

- (void)exitApplication {
    AppDelegate *app = [UIApplication sharedApplication].delegate;
    UIWindow *window = app.window;
    
    [UIView animateWithDuration:1.0f animations:^{
        window.alpha = 0;
        window.frame = CGRectMake(0, window.bounds.size.width, 0, 0);
    } completion:^(BOOL finished) {
        exit(0);
    }];
    
}

必要时,我们还需要设置Plist属性

在plist设置屬性:Application does not run in background = YES

2.直接回到主界面

[self.navigationController popToRootViewControllerAnimated:YES]; 

当然,你也可以使用 [UIApplication shareApplication].keyWindow.rootViewController.viewControllers进行遍历回退

3.禁止UIScrollView及其子类边界弹簧效果

mWebView..scrollView.bounces = NO

4.修改状态栏颜色

第一种方法:

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackOpaque;
self.navigationController.navigationBar.tintColor = [UIColor blackColor];

if (is_ios_7_Later) {

   self.view.window.frame = CGRectMake(0, 20, self.view.window.frame.size.width, self.view.window.frame.size.height - 20);
  [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:NO];
}

第二种方法(这方法比较简单):

UIView *statusBarView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];
statusBarView.backgroundColor=[UIColor blackColor];
[self.view addSubview:statusBarView];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:NO];

[UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor colorWithHexString:@"#D3331f"];

    if([[UIColor getWhiteBlackByHexString:@"#D3331f"] isEqual:[UIColor blackColor]])
    {
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
    }
    else
    {
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    }

5.解决UIImage的imageWithContentsOfFile获取图片非自动适配的问题

+(NSString *) pathForResource:(NSString *) picName type:(NSString *) type
{
    
    if([NSStringisEmptyOrNil:picName])
    {
        returnnil;
    }
    if(![NSStringisEmptyOrNil:type] && [NSStringtrim:type].length>0)
    {
       
        
        return [selfgetBundlePath:picName type:type];
        
    }
    else
    {
        return [self pathForResource:picName];
    }

}

+(NSString *) getBundlePath:(NSString *) picName type:(NSString *) type
{
    
    NSString* suggestScaleSuffix  = [UIImagegetImageScaleSuffix];
    
    NSString * fitForPicName = [picName stringByAppendingString:suggestScaleSuffix];
    NSString * path = [[NSBundlemainBundle] pathForResource:fitForPicName ofType:type inDirectory:@"myios.bundle"];
    
    if([NSStringisEmptyOrNil:path])
    {
        
        if([@"@3x"isEqualToString:suggestScaleSuffix])
        {
            NSString * fitForPicName = [picName stringByAppendingString:@"@2x"];
            path = [[NSBundlemainBundle] pathForResource:fitForPicName ofType:type inDirectory:@"myios.bundle"];
            
        }
        
        if([NSStringisEmptyOrNil:path] && [@"@2x"isEqualToString:suggestScaleSuffix])
        {
            path = [[NSBundlemainBundle] pathForResource:picName ofType:type inDirectory:@"myios.bundle"];
            
        }
        
    }
    return path;
}

+(NSString *) pathForResource:(NSString *) imageFullName
{
    
    if(imageFullName==nil)
    {
        return  nil;
    }
    
     NSString *pathExtension = [imageFullName pathExtension];
     NSString *subExts = @".png|.PNG|.9.png|.9.PNG|.jpeg|.JPEG|.jpg|.JEG|.bmp|.BMP|.gif|.GIF|.ico|.ICO|.tif|.TIF|.cur|.CUR|.xbm|.XBM";
    
    if([NSStringisEmptyOrNil:pathExtension])
    {
        NSString * path = nil;
        NSArray * imageSuffixes = [subExts componentsSeparatedByString:@"|"];
        
        for (NSString * imageSuffix in imageSuffixes)
        {
            path = [selfgetBundlePath:imageFullName type:imageSuffix];
            
            if(![NSStringisEmptyOrNil:path])
            {
                return path;
            }
        }
    
    }
    elseif([subExts containsString:[@"."stringByAppendingString:pathExtension]])
    {
        
        imageFullName = [imageFullName substringWithRange:NSMakeRange(0, imageFullName.length-pathExtension.length-1)];
        NSString * path = [selfgetBundlePath:imageFullName type:pathExtension];
    
        return path;
    }
    
    returnnil;
}


+(NSString *)getImageScaleSuffix
{
    if ( [[[UIDevicecurrentDevice] systemVersion] intValue] >= 4 && [[UIScreenmainScreen] scale] == 2.0 )
    {
        
        return@"@2x";
    }elseif ( [[[UIDevicecurrentDevice] systemVersion] intValue] >= 4 && [[UIScreenmainScreen] scale] == 3.0 )
    {
        
        return@"@3x";
    
    }else{
        return@"";
    }

}

6.解决SQlite数据库批量操作问题

批量插入:

INSERT INTO MYTABLE VALUES(.....),(.....),(.....).....(.....);

批量更新插入

REPLACE INTO MYTABLE VALUES(.....),(.....),(.....).....(.....);

查询受影响的函数

在sqlite中可以直接调用

sqlite_changes(sqlite * db);

当然你也可以使用如下语句

SELECT CHANGES();

7.iOS UITableView默认行高问题

UITableView默认secctionheader与sectionFooter高度是10,当然代理返回值是0的话依然是10,为了不影响使用0高度,将代理的返回值0.0001

关于UITableView缓存identifier 

​​​​​​​不要写成局部静态变量,建议写成全局变量,并且在初始化时使其变成和以往不重复的值

8.时间戳计算

  NSDateFormatter * datefmt = [[NSDateFormatteralloc] init];
        [datefmt setTimeStyle:NSDateFormatterNoStyle];
        [datefmt setDateStyle:NSDateFormatterNoStyle];
        NSTimeZone * timezone = [NSTimeZonetimeZoneWithName:@"Asia/Chongqing"];
        [datefmt setTimeZone: timezone];
        
        [datefmt setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        
        NSDate * sDate = [datefmt dateFromString:@"2014-12-25 12:24:35"];
        
        NSDate * tDate = [NSDatedate];
        
        NSTimeInterval startTime = [sDate timeIntervalSince1970];
        NSTimeInterval toTime =[tDate timeIntervalSince1970] ;
        NSTimeInterval interval = round(toTime-startTime);
        
        NSLog(@"interval=%f",interval);
        NSLog(@"interval=%@",[datefmt stringFromDate:[NSDatedateWithTimeIntervalSince1970:interval ]]);

9.ARC下获取对象的引用计数

NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)myObject));

10.拦截Ajax请求,实现native与web同步与异步通信

重点是实现NSURLProtocol和跨域通信问题

11.截屏

- (UIImage *)screenshot:(UIViewController *) controller
{
    CGRect rect = controller.view.bounds;
    
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, [UIScreen mainScreen].scale);
    CGContextRef context = UIGraphicsGetCurrentContext();
    if (context == NULL) return nil;
    CGContextTranslateCTM(context, -rect.origin.x, -rect.origin.y);
    
    [self layoutIfNeeded];
    [[controller.view layer] renderInContext:context];
    
    UIImage *screenshotImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return screenshotImage;
}

 

© 著作权归作者所有

共有 人打赏支持
IamOkay
粉丝 187
博文 459
码字总数 372015
作品 0
海淀
程序员
那些在学习iOS开发前就应该知道的事(part 1)

英文原文:Things I wish I had known before starting iOS development—Part 1 设计师设计出来了一个不错的引导界面,然而当我看到设计稿的时候,我们的app也没几天就要上线了。这个界面模...

TomatosX
2015/06/12
0
0
iOS中使用schema协议调用APP和使用iframe打开APP的例子

在iOS中,需要调起一个app可以使用schema协议,这是iOS原生支持的,并且因为iOS系统中都不能使用自己的浏览器内核,所以所有的浏览器都支持,这跟android生态不一样,android是可以自己搞内核...

BearCatYN
2015/06/12
0
1
学习如何针对iOS 7进行开发?

  iOS 7已经发布了六个测试版,除了beta 6进行了小幅修正外,其他几个测试版都有不小的改动。昨天有消息说苹果将在9月10日发布iOS 7正式版,那么GM版很快将会与开发者见面。在iOS 7来临前夕...

fangzhou99
2013/09/17
0
0
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊
05/26
0
0
(转)直接拿来用!最火的iOS开源项目(二)

“每一次的改变总意味着新的开始。”这句话用在iOS上可谓是再合适不过的了。GitHub上的iOS开源项目数不胜数,iOS每一次的改变,总会引发iOS开源项目的演变,从iOS 1.x到如今的iOS 7,有的项目...

孙启超
2013/06/21
0
1

没有更多内容

加载失败,请刷新页面

加载更多

ionic安卓打包过程

在项目文件夹下执行命令 ionic cordova platform add android 打开android studio -> Configure->SDK Manager 安装android 26...

lilugirl
3分钟前
0
0
arts-week14

Algorithm 923. 3Sum With Multiplicity - LeetCode Review Building a network attached storage device with a Raspberry Pi 搭建家用储存系统,使用树莓派和移动硬盘,搭建一个 NAS,操作......

yysue
5分钟前
0
0
理解OAuth 2.0

OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749。...

吴伟祥
18分钟前
0
0
源码中常用英文单词

Resolver BeansDtdResolver : spring bean dtd 解析器

职业搬砖工程师
19分钟前
0
0
区块链入门教程以太坊源码分析event源码分析

兄弟连区块链入门教程以太坊源码分析event源码分析,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退...

兄弟连区块链入门教程
20分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部