文档章节

iOS app开发中常用技巧

IamOkay
 IamOkay
发布于 2016/05/21 20:35
字数 742
阅读 93
收藏 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
博文 458
码字总数 370505
作品 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开源项目(二)

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

孙启超
2013/06/21
0
1
如何判断你是合格的高级iOS开发工程师?

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

_小迷糊
05/26
0
0
学习如何针对iOS 7进行开发?

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

fangzhou99
2013/09/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

@SpringBootApplication 注解

@SpringBootApplication注解是一个组合注解,包含以下注解 @Target(ElementType.TYPE) 注解的作用目标 @Retention(RetentionPolicy.RUNTIME) Reteniton的作用是定义被它所注解的注解保留多久,...

java.刘
33分钟前
0
0
sentinel自定义DataSource实战

序 本文主要研究一下如何自定义sentinel的DataSource,这里以jdbc为例。 maven <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sen......

go4it
49分钟前
1
0
xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和Decisio...

tantexian
50分钟前
0
0
php-fpm的pool - 慢执行日志 - 进程管理 - open_basedir

php-fpm的pool : 为避免多站点使用同一个pool时因一个站点故障导致php资源耗尽,牵连使用同一个pool的其他站点的正常工作,可对每一个站点设置独立pool。 增加pool: 1.编辑php-fpm配置文件...

ZHENG-JY
今天
0
0
Linux之ssh服务默认端口修改

导读 SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Telnet,具有更高的安全...

问题终结者
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部