热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS开发的一些小技巧

201403261、判断设备是3.5寸还是4寸?if ([[UIScreen mainScreen] currentMode].size.height  480||[[UIScreenmainScreen]&n

20140326

1、判断设备是3.5寸还是4寸?

if ([[UIScreen mainScreencurrentMode].size.height == 480||[[UIScreenmainScreencurrentMode].size.height == 960)

{

    //这是3.5寸的iPhone设备

}

else

{

    //这是4寸的iPhone设备

}

之前写了好长时间代码,忘了在3.5寸屏幕适配,今天一跑,发现控件的显示有问题,需要通过代码判断下屏幕尺寸,然后做相应处理,但是我觉得这种代码真的不好,又要适配不同的系统-iOS6和iOS7,又要适配不同的设备-iPad和iPhone,还要适配不同的尺寸。

2、Apple Mach-O Linker Error

今天写重新打开Xcode,运行项目,突然有21个Error,我以为是Xcode抽风了,所以点击菜单Product->Clean,以为清理一下就OK了,悲剧的是重新编译,还是21个Error,这时我就紧张了,再次Clean以后,看着Xcode编译的过程。大家肯定都知道“Compling 100 of 200 files”这个编译的提示进度条,我看编译时候一直没有报错,然后开始了链接Link的过程,然后就报错了,仔细看看错误,就是"Apple Mach-O Linker Error",就是说在链接的时候发生了错误,一般情况下这是因为引用第三方库时候没有导入相对应的框架framework,或者是因为没有自动添加某些.m文件到Complie File。

解决的方法:

点击工程文件->Build Phases->Complie Sources添加没有添加的.m文件,或者Build Phrases->Link Binary with Libraries,添加没有导入的框架framework。

今天我出现这样的错误其实不是因为以上这些原因,而是因为我的项目当中有C++代码以及一些复杂的框架和SDK,所以不能在模拟器上面运行,但是我开机时候忘了选择真机调试,导致了Linker Error。当然大家如果遇到这种Apple Mach-O Linker Error,要仔细看看原因,基本上改正的方法就是添加.m文件或者导入相关的Library。记住这个错误的原因,以后就不用在重复地寻找解决方法。

20140327

3、设置Button在不同状态下的图片

今天看了看UI设计师给我的设计图,Button有未点击的背景图片和点击状态下的图片,使用代码写很简单,我们对于设置Button背景图片的代码肯定了然于胸,

[btn setImage:[UIImage p_w_picpathNamed:@"normal"forState:UIControlStateNormal];

想要设置点击状态下的背景图片,代码如下,

[findBtn setImage:[UIImage p_w_picpathNamed:@"selected"forState:UIControlStateSelected];

按住Command点击UIControlStateNormal关键字,可以查看资源库中对于Button不同状态的定义,定义如下代码,

typedef NS_OPTIONS(NSUInteger, UIControlState) {

    UIControlStateNormal       = 0,

    UIControlStateHighlighted  = 1 << 0,                  // used when UIControl isHighlighted is set

    UIControlStateDisabled     = 1 << 1,

    UIControlStateSelected     = 1 << 2,                  // flag usable by app (see below)

    UIControlStateApplication  = 0x00FF0000,              // additional flags available for application use

    UIControlStateReserved     = 0xFF000000               // flags reserved for internal framework use

};

大家有兴趣可以设置不同状态看看是什么效果,此处不再啰嗦。

4、今天在使用xib编程时候,拖动xib中的UI空间到.h文件时候,有一个红色警告“could not insert new outlet connection,Could not find any information of the class name xxxViewController”,我头上一阵冷汗啊,这是第一次遇到这种问题,网上搜索了下,解决方法是,打开Finder,选择菜单->前往文件夹->~/Library/Developer/Xcode/DerivedData/,把遇到问题的项目文件夹删除,然后重新启动Xcode,然后就OK了。我第一次删除的时候,没有解决这个问题,然后又回头删除了一下,重启Xcode,再重新拖动UI空间到.h文件,一切都正常了。

5、现在的项目是手动内存管理,所以在引入第三方资源库时候,很多资源库更新以后都开始使用arc进行编码,这样就导致两种代码风格不一致,有的时候可能开发者也没有注意到这些问题,反正用的时候也没有报错,就直接使用了;但是有的时候,因为arc编码中用到了新的属性修饰符,例如weak,这时候在手动管理内存的代码中就不能编译通过,报错的内容就是:@synthesize of 'weak' property is only allowed in ARC or GC mode,这就是引入的arc代码在项目中的冲突,有一种解决办法就是把资源代码中的weak修饰符改为assign,但是这种方法毕竟是把别人写的代码给改了,有的时候往往会出现闪退、崩溃的问题。

比较好的解决办法就是项目配置文件->Build Phrases->Complie Files,找到出现问题的资源库文件(比如weak修饰符所在的文件),双击Complie Files中的该文件,在空白行中写入-fobjc-arc,这样就可以有效防止该冲突。反过来有的时候,在arc代码中引入手动管理内存的代码,我们在Complie Files中为新增的资源文件增加-fno-objc-arc,这样就避免了手动管理内存的代码在arc代码中的冲突。

20140328

6、修改导航栏NavigationBar为透明色

项目中有个需求就是要把导航栏设置为透明色,这样才能不遮挡整个背景图片,我们的UI设计需求就是导航栏部分也能看见背景图片。这个需求看起来简单,做起来难,不过还是在stackoverflow找到了答案。解决方案点此链接,主要代码就是

[self.navigationBar setBackgroundImage:[UIImage new]

                             forBarMetrics:UIBarMetricsDefault];

self.navigationBar.shadowImage = [UIImage new];

self.navigationBar.translucent = YES;//这一行不是关键性代码,甚至是错误代码,因为在iOS 6会造成一个bug

代码意思大家都能看懂,主要设置NavigationBar背景图片为空、透明translucent为YES。这种时候还有两个问题,第一就是Status Bar(就是现实时间、电源信号的状态栏)字体看不清了,这时候通过设置状态栏Status Bar的风格为默认的就可以,

[[UIApplication sharedApplicationsetStatusBarStyle:UIStatusBarStyleDefault];

第二个问题是导航栏的字体颜色现在也看不清,通过下面的代码可以修改,

NSDictionary *navbarTitleTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:

                                                   [UIColor blackColor],UITextAttributeTextColor,

                                                   [UIColor whiteColor], UITextAttributeTextShadowColor,

                                                   [NSValue valueWithUIOffset:UIOffsetMake(-10)],UITextAttributeTextShadowOffsetnil];

        [[UINavigationBar appearancesetTitleTextAttributes:navbarTitleTextAttributes];

原文在stackoverflow,答案这样描述了上述代码的作用:通过UINavigationBar的setTitleTextAttributes,你可以设置字体、颜色、偏移坐标(offset)和阴影的颜色,通过调用UINavigationBar的类方法setTitleTextAttributes,就是默认设置了你整个应用程序中的导航栏的显示效果。

20140329

7、NSIndexPath没那么恐怖

UITableView生命了一个NSIndexPath的类别,主要用来标识当前cell在tableView中的位置,该类别有section和row两个属性,前者标识当前cell初一第几个section中,后者代表在该section中的第几行。创建一个NSIndexPath的方法是,

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:2 inSection:0];

那么创建这个变量有什么用呢?通常情况下,我们在进行cell内容的插入、删除和更新的时候需要用到,这时候NSIndexPath与NSMutableArray搭配使用,可以完成插入、删除。。等操作,例如

NSMutableArray *indexPaths = [[NSMutableArray alloc]init];

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:2 inSection:0];

[indexPaths addObject:indexPath];

例如插入一个cell,使用下面的代码,

[self.tableView insertRowsAtIndexPaths:indexPathswithRowAnimation:UITableViewRowAnimationAutomatic];

[index release];

这种UI界面的更新操作,不要放到主线程中执行,因为会造成界面卡顿,要放在后台线程执行。这里只是写了界面方面的操作,同时应该更新数据源,不然只插入cell,而不插入数据,会造成程序crush。

8、神秘的Bundle并不神秘

很多开源的代码中都能看见Bundle的身影,里面放了一些文件,例如图片或者文本文件,我一直搞不懂它的作用是什么。搜索了以后才知道:Bundle文件是为了方便在iOS开发过程中便便管理资源文件,比如kkgridview里就把所需要的图片文件全部放到一个bundle中来进行管理的。创建Bundle最简单的方式就是,新建一个文件夹,例如MyBundle,在里面放几张图片,然后将文件件后缀名改为.bundle,并拖动其至Xcode中。在代码中使用Bundel中的文件方法是如下,

NSString *bundlePath = [[NSBundle mainBundle].resourcePathstringByAppendingPathComponent:@"MyBundle.bundle"];

NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];

UIImage *(^getBundleImage)(NSString *) = ^(NSString *n) {

    return [UIImage p_w_picpathWithContentsOfFile:[bundle pathForResource:n ofType:@"png"]];

};

UIImage *myImg = getBundleImage(@"iphone_52x52");

9、frame和bounds的区别

bounds是一块相对于自身(0,0)的矩形区域,而frame是相对于父view的矩形区域,下面的内容是我通过NSLog输出了bounds和frame的信息,

bounds.origin.x: 0.000000

bounds.origin.y: 0.000000

bounds.size.width: 140.000000

bounds.size.height: 140.000000

frame.origin.x: 6.000000

frame.origin.y: 9.000000

frame.size.width: 140.000000

frame.size.height: 140.000000

可以看到,不管是bounds还是frame,width和height是相同的;而(x,y)坐标却是不同的,因为bounds是相对于其自身的位置,所以(x,y)总是(0,0),frame是相对于父view的位置,所以不同于bounds。所以以后我们获取view的宽度和高度,bounds和frame的情况是一样的。

10、更加快捷的获取view的宽度和高度

之前我们是通过self.view.frame.size.width来获取宽度,通过self.view.frame.size.height获取高度。其实CGRect数据结构提供了更加快捷的方式,CGRectGetWidth(self.view.frame),或者CGRectGetWidth(self.view.bounds),参见上一条--从frame和bounds获取的宽高是一样的。同样获取高度,CGRectGetHeight(self.view.frame)。



推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
author-avatar
含糊hagle
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有