iOS巅峰之开发过程中的小知识点大全
一、调用代码使app进入后台,达到点击home键的效果。(私有api)
[[uiapplication sharedapplication] performselector:@selector(suspend)];
suspend的英文意思有:暂停; 悬; 挂; 延缓;
二、带有中文的url处理。
大概举个例子,类似下面的url,里面直接含有中文,可能导致播放不了,那么我们要处理一个这个url,因为他太操蛋了,居然用中文。
http://static.tripbe.com/videofiles/视频/我的自拍视频.mp4 nsstring *path = (__bridge_transfer nsstring *)cfurlcreatestringbyreplacingpercentescapesusingencoding(null, (__bridge cfstringref)model.mp4_url, cfstr(""), cfstringconvertnsstringencodingtoencoding(nsutf8stringencoding));
三、获取uiwebview的高度
个人最常用的获取方法,感觉这个比较靠谱
- (void)webviewdidfinishload:(uiwebview *)webview { cgfloat height = [[webview stringbyevaluatingjavascriptfromstring:@"document.body.offsetheight"] floatvalue]; cgrect frame = webview.frame; webview.frame = cgrectmake(frame.origin.x, frame.origin.y, frame.size.width, height); }
四、给uiview设置图片(uilabel一样适用)
some html string \n this is some text!- 第一种方法:
利用的uiview的设置背景颜色方法,用图片做图案颜色,然后传给背景颜色。
uicolor *bgcolor = [uicolor colorwithpatternimage: [uiimage imagenamed:@"bgimg.png"]; uiview *myview = [[uiview alloc] initwithframe:cgrectmake(0,0,320,480)]; [myview setbackgroundcolor:bgcolor];
- 第二种方法:
uiimage *image = [uiimage imagenamed:@"yourpicname@2x.png"]; yourview.layer.contents = (__bridge id)image.cgimage; //设置显示的图片范围 yourview.layer.contentscenter = cgrectmake(0.25,0.25,0.5,0.5);//四个值在0-1之间,对应的为x,y,width,height。
五、去掉uitableview多余的分割线
yourtableview.tablefooterview = [uiview new];
六、调整cell分割线的位置,两个方法一起用,暴力解决,防脱发
-(void)viewdidlayoutsubviews { if ([self.mytableview respondstoselector:@selector(setseparatorinset:)]) { [self.mytableview setseparatorinset:uiedgeinsetsmake(0, 0, 0, 0)]; } if ([self.mytableview respondstoselector:@selector(setlayoutmargins:)]) { [self.mytableview setlayoutmargins:uiedgeinsetsmake(0, 0, 0, 0)]; } } #pragma mark - cell分割线 - (void)tableview:(uitableview *)tableview willdisplaycell:(uitableviewcell *)cell forrowatindexpath:(nsindexpath *)indexpath { if ([cell respondstoselector:@selector(setseparatorinset:)]){ [cell setseparatorinset:uiedgeinsetsmake(0, 0, 0, 0)]; } if ([cell respondstoselector:@selector(setlayoutmargins:)]) { [cell setlayoutmargins:uiedgeinsetsmake(0, 0, 0, 0)]; } }
七、uilabel和uiimageview的交互userinteractioneabled默认为no。那么如果你把这两个类做为父试图的话,里面的所有东东都不可以点击哦。曾经有一个人,让我帮忙调试bug,他调试很久没搞定,就是把wmplayer对象(播放器对象)放到一个uiimageview上面。这样imageview addsubview:wmplayer 后,播放器的任何东东都不能点击了。userinteractioneabled设置为yes即可。
八、uisearchcontroller和uisearchbar的cancle按钮改title问题,简单粗暴
- (bool)searchbarshouldbeginediting:(uisearchbar *)searchbar { searchcontroller.searchbar.showscancelbutton = yes; uibutton *cancelbtn = [searchcontroller.searchbar valueforkey:@"cancelbutton"]; [cancelbtn settitle:@"取消" forstate:uicontrolstatenormal]; [cancelbtn settitlecolor:[uicolor colorwithred:14.0/255.0 green:180.0/255.0 blue:0.0/255.0 alpha:1.00] forstate:uicontrolstatenormal]; searchbar.showscancelbutton = yes; return yes; }
九、uitableview收起键盘何必这么麻烦
一个属性搞定,效果好(uiscrollview同样可以使用)
以前是不是觉得[self.view endediting:yes];很屌,这个下面的更屌。
yourtableview.keyboarddismissmode = uiscrollviewkeyboarddismissmodeondrag;
另外一个枚举为uiscrollviewkeyboarddismissmodeinteractive,表示在键盘内部滑动,键盘逐渐下去。
十、nstimer
1、nstimer计算的时间并不精确
2、nstimer需要添加到runloop运行才会执行,但是这个runloop的线程必须是已经开启。
3、nstimer会对它的tagert进行retain,我们必须对其重复性的使用intvailte停止。target如果是self(指uiviewcontroller),那么vc的retaincount+1,如果你不释放nstimer,那么你的vc就不会dealloc了,内存泄漏了。
十一、uiviewcontroller没用大小(frame)
经常有人在群里问:怎么改变vc的大小啊?
瞬间无语。(只有uiview才能设置大小,vc是控制器啊,哥!)
十二、用十六进制获取uicolor(类方法或者category都可以,这里我用工具类方法)
+ (uicolor *)colorwithhexstring:(nsstring *)color { nsstring *cstring = [[color stringbytrimmingcharactersinset:[nscharacterset whitespaceandnewlinecharacterset]] uppercasestring]; // string should be 6 or 8 characters if ([cstring length] < 6) { return [uicolor clearcolor]; } // strip 0x if it appears if ([cstring hasprefix:@"0x"]) cstring = [cstring substringfromindex:2]; if ([cstring hasprefix:@"#"]) cstring = [cstring substringfromindex:1]; if ([cstring length] != 6) return [uicolor clearcolor]; // separate into r, g, b substrings nsrange range; range.location = 0; range.length = 2; //r nsstring *rstring = [cstring substringwithrange:range]; //g range.location = 2; nsstring *gstring = [cstring substringwithrange:range]; //b range.location = 4; nsstring *bstring = [cstring substringwithrange:range]; // scan values unsigned int r, g, b; [[nsscanner scannerwithstring:rstring] scanhexint:&r]; [[nsscanner scannerwithstring:gstring] scanhexint:&g]; [[nsscanner scannerwithstring:bstring] scanhexint:&b]; return [uicolor colorwithred:((float) r / 255.0f) green:((float) g / 255.0f) blue:((float) b / 255.0f) alpha:1.0f]; }
十三、获取今天是星期几
+ (nsstring *) getweekdaystringwithdate:(nsdate *) date { nscalendar * calendar = [[nscalendar alloc] initwithcalendaridentifier:nsgregoriancalendar]; // 指定日历的算法 nsdatecomponents *comps = [calendar components:nsweekdaycalendarunit fromdate:date]; // 1 是周日,2是周一 3.以此类推 nsnumber * weeknumber = @([comps weekday]); nsinteger weekint = [weeknumber integervalue]; nsstring *weekdaystring = @"(周一)"; switch (weekint) { case 1: { weekdaystring = @"(周日)"; } break; case 2: { weekdaystring = @"(周一)"; } break; case 3: { weekdaystring = @"(周二)"; } break; case 4: { weekdaystring = @"(周三)"; } break; case 5: { weekdaystring = @"(周四)"; } break; case 6: { weekdaystring = @"(周五)"; } break; case 7: { weekdaystring = @"(周六)"; } break; default: break; } return weekdaystring; }
十四、uiview的部分圆角问题
uiview *view2 = [[uiview alloc] initwithframe:cgrectmake(120, 10, 80, 80)]; view2.backgroundcolor = [uicolor redcolor]; [self.view addsubview:view2]; uibezierpath *maskpath = [uibezierpath bezierpathwithroundedrect:view2.bounds byroundingcorners:uirectcornerbottomleft | uirectcornerbottomright cornerradii:cgsizemake(10, 10)]; cashapelayer *masklayer = [[cashapelayer alloc] init]; masklayer.frame = view2.bounds; masklayer.path = maskpath.cgpath; view2.layer.mask = masklayer; //其中, byroundingcorners:uirectcornerbottomleft | uirectcornerbottomright //指定了需要成为圆角的角。该参数是uirectcorner类型的,可选的值有: * uirectcornertopleft * uirectcornertopright * uirectcornerbottomleft * uirectcornerbottomright * uirectcornerallcorners
从名字很容易看出来代表的意思,使用“|”来组合就好了。
十五、设置滑动的时候隐藏navigationbar
navigationcontroller.hidesbarsonswipe = yes;
十六、ios画虚线
记得先 quartzcore框架的导入
#import cgcontextref context =uigraphicsgetcurrentcontext(); cgcontextbeginpath(context); cgcontextsetlinewidth(context, 2.0); cgcontextsetstrokecolorwithcolor(context, [uicolor whitecolor].cgcolor); cgfloat lengths[] = {10,10}; cgcontextsetlinedash(context, 0, lengths,2); cgcontextmovetopoint(context, 10.0, 20.0); cgcontextaddlinetopoint(context, 310.0,20.0); cgcontextstrokepath(context); cgcontextclosepath(context);
十七、自动布局中多行uilabel,需要设置其preferredmaxlayoutwidth属性才能正常显示多行内容。另外如果出现显示不全文本,可以在计算的结果基础上+0.5。
cgfloat h = [model.message boundingrectwithsize:cgsizemake([uiscreen mainscreen].bounds.size.width - kgap-kavatar_size - 2*kgap, cgfloat_max) options:nsstringdrawinguseslinefragmentorigin attributes:attributes context:nil].size.height+0.5;
十八、 禁止程序运行时自动锁屏
[[uiapplication sharedapplication] setidletimerdisabled:yes];
十九、kvc相关,支持操作符
kvc同时还提供了很复杂的函数,主要有下面这些
①简单集合运算符
简单集合运算符共有@avg, @count , @max , @min ,@sum5种,都表示啥不用我说了吧, 目前还不支持自定义。
@interface book : nsobject @property (nonatomic,copy) nsstring* name; @property (nonatomic,assign) cgfloat price; @end @implementation book @end book *book1 = [book new]; book1.name = @"the great gastby"; book1.price = 22; book *book2 = [book new]; book2.name = @"time history"; book2.price = 12; book *book3 = [book new]; book3.name = @"wrong hole"; book3.price = 111; book *book4 = [book new]; book4.name = @"wrong hole"; book4.price = 111; nsarray* arrbooks = @[book1,book2,book3,book4]; nsnumber* sum = [arrbooks valueforkeypath:@"@sum.price"]; nslog(@"sum:%f",sum.floatvalue); nsnumber* avg = [arrbooks valueforkeypath:@"@avg.price"]; nslog(@"avg:%f",avg.floatvalue); nsnumber* count = [arrbooks valueforkeypath:@"@count"]; nslog(@"count:%f",count.floatvalue); nsnumber* min = [arrbooks valueforkeypath:@"@min.price"]; nslog(@"min:%f",min.floatvalue); nsnumber* max = [arrbooks valueforkeypath:@"@max.price"]; nslog(@"max:%f",max.floatvalue); 打印结果 2016-04-20 16:45:54.696 kvcdemo[1484:127089] sum:256.000000 2016-04-20 16:45:54.697 kvcdemo[1484:127089] avg:64.000000 2016-04-20 16:45:54.697 kvcdemo[1484:127089] count:4.000000 2016-04-20 16:45:54.697 kvcdemo[1484:127089] min:12.000000
nsarray 快速求总和 最大值 最小值 和 平均值
nsarray *array = [nsarray arraywithobjects:@"2.0", @"2.3", @"3.0", @"4.0", @"10", nil]; cgfloat sum = [[array valueforkeypath:@"@sum.floatvalue"] floatvalue]; cgfloat avg = [[array valueforkeypath:@"@avg.floatvalue"] floatvalue]; cgfloat max =[[array valueforkeypath:@"@max.floatvalue"] floatvalue]; cgfloat min =[[array valueforkeypath:@"@min.floatvalue"] floatvalue]; nslog(@"%f\n%f\n%f\n%f",sum,avg,max,min);
二十、使用mbprogresshud时,尽量不要加到uiwindow上,加self.view上即可。如果加uiwindow上在ipad上,旋转屏幕的时候mbprogresshud不会旋转。之前有人遇到这个bug,我让他改放到self.view上即可解决此bug。
二十一、强制让app直接退出(非闪退,非崩溃)
- (void)exitapplication { appdelegate *app = [uiapplication sharedapplication].delegate; uiwindow *window = app.window; [uiview animatewithduration:1.0f animations:^{ window.alpha = 0; } completion:^(bool finished) { exit(0); }]; }
二十二、label行间距
nsmutableattributedstring *attributedstring = [[nsmutableattributedstring alloc] initwithstring:self.contentlabel.text]; nsmutableparagraphstyle *paragraphstyle = [[nsmutableparagraphstyle alloc] init]; [paragraphstyle setlinespacing:3]; //调整行间距 [attributedstring addattribute:nsparagraphstyleattributename value:paragraphstyle range:nsmakerange(0, [self.contentlabel.text length])]; self.contentlabel.attributedtext = attributedstring;
二十三、cocoapods pod install/pod update更新慢的问题
pod install –verbose –no-repo-update
pod update –verbose –no-repo-update
如果不加后面的参数,默认会升级cocoapods的spec仓库,加一个参数可以省略这一步,然后速度就会提升不少。
二十四、mrc和arc混编设置方式
在xcode中targets的build phases选项下compile sources下选择 不需要arc编译的文件
双击输入 -fno-objc-arc 即可
mrc工程中也可以使用arc的类,方法如下:
在xcode中targets的build phases选项下compile sources下选择要使用arc编译的文件
双击输入 -fobjc-arc 即可
二十五、把tableview里cell的小对勾的颜色改成别的颜色
_yourtableview.tintcolor = [uicolor redcolor];
二十六、解决同时按两个按钮进两个view的问题
[button setexclusivetouch:yes];
二十七、修改textfieldplaceholder字体颜色和大小
textfield.placeholder = @"请输入用户名"; [textfield setvalue:[uicolor redcolor] forkeypath:@"_placeholderlabel.textcolor"]; [textfield setvalue:[uifont boldsystemfontofsize:16] forkeypath:@"_placeholderlabel.font"];
二十八、禁止textfield和textview的复制粘贴菜单
这里有一个误区,很多同学直接使用uitextfield,然后在vc里面写这个方法,返回no,没效果。怎么搞都不行,但是如果用uipasteboard的话,项目中所有的编辑框都不能复制黏贴了,真操蛋。
我们要做的是新建一个类mytextfield继承uitextfield,然后在mytextfield的.m文件里重写这个方法,就可以单独控制某个输入框了。
-(bool)canperformaction:(sel)action withsender:(id)sender { if ([uimenucontroller sharedmenucontroller]) { [uimenucontroller sharedmenucontroller].menuvisible = no; } return no; }
二十九:如何进入我的软件在app store 的页面
先用itunes link maker找到软件在访问地址,格式为itms-apps://ax.itunes.apple.com/…,然后
#define ituneslink @"itms-apps://ax.itunes.apple.com/..." nsurl *url = [nsurl urlwithstring:ituneslink]; if([[uiapplication sharedapplication] canopenurl:url]){ [[uiapplication sharedapplication] openurl:url]; }
如果把上述地址中itms-apps改为http就可以在中打开了。可以把这个地址放在自己的网站里,链接到app store。
itunes link maker地址:
三十、二级三级页面隐藏tabbar
1、单个处理
yourviewcontroller *yourvc = [yourviewcontroller new]; yourvc.hidesbottombarwhenpushed = yes; [self.navigationcontroller pushviewcontroller:yourvc animated:yes];
2.统一在基类里面处理
新建一个类basenavigationcontroller继承uinavigationcontroller,然后重写 -(void)pushviewcontroller:(uiviewcontroller *)viewcontroller animated:(bool)animated这个方法。所有的push事件都走此方法。
@interface basenavigationcontroller : uinavigationcontroller @end -(void)pushviewcontroller:(uiviewcontroller *)viewcontroller animated:(bool)animated{ [super pushviewcontroller:viewcontroller animated:animated]; if (self.viewcontrollers.count>1) { viewcontroller.hidesbottombarwhenpushed = yes; } }
三十一、取消系统的返回手势
self.navigationcontroller.interactivepopgesturerecognizer.enabled = no;
三十二、修改uiwebview中字体的大小,颜色
1、uiwebview设置字体大小,颜色,字体:
uiwebview无法通过自身的属性设置字体的一些属性,只能通过html代码进行设置
在webview加载完毕后,在
- (void)webviewdidfinishload:(uiwebview *)webview方法中加入js代码 nsstring *str = @"document.getelementsbytagname('body')[0].style.webkittextsizeadjust= '60%'"; [_webview stringbyevaluatingjavascriptfromstring:str];
或者加入以下代码
nsstring *jsstring = [[nsstring alloc] initwithformat:@"document.body.style.fontsize=%f;document.body.style.color=%@",fontsize,fontcolor]; [webview stringbyevaluatingjavascriptfromstring:jsstring];
三十三、nsstring处理技巧
使用场景举例:可以用在处理用户用户输入在uitextfield的文本
//待处理的字符串 nsstring *string = @" a b cd efg\n mn\n"; //字符串替换,处理后的string1 = @"abcdef\nmn\n"; nsstring *string1 = [string stringbyreplacingoccurrencesofstring:@" " withstring:@""]; //去除两端空格(注意是两端),处理后的string2 = @"a b cd efg\n mn\n"; nsstring *string2 = [string stringbytrimmingcharactersinset:[nscharacterset whitespacecharacterset]]; //去除两端回车(注意是两端),处理后的string3 = @" a b cd efg\n mn"; nsstring *string3 = [string stringbytrimmingcharactersinset:[nscharacterset newlinecharacterset]]; //去除两端空格和回车(注意是两端),处理后的string4 = @"a b cd efg\n mn"; nsstring *string4 = [string stringbytrimmingcharactersinset:[nscharacterset whitespaceandnewlinecharacterset]];
三十四、主线程操作ui(对ui进行更新只能在主线程进行)
解释:所谓的在主线程更新ui、操作ui,大致的意思就是设置uilabel的text或者设置tabbar的badgevalue,设置uiimageview的image等等。
回到主线程方式1:
[self performselectoronmainthread:@selector(updateimage:) withobject:data waituntildone:yes];
performselectoronmainthread方法是nsobject的分类方法,每个nsobject对象都有此方法,
它调用的selector方法是当前调用控件的方法,例如使用uiimageview调用的时候selector就是uiimageview的方法
object:代表调用方法的参数,不过只能传递一个参数(如果有多个参数请使用对象进行封装)
waituntildone:是否线程任务完成执行
回到主线程方式2:
dispatch_async(dispatch_get_main_queue(), ^{ //更新ui的代码 });
这个不多解释,gcd的方法,注意不要在主线程掉用。
三十五、判断模拟器
if (target_iphone_simulator) { nslog(@"是模拟器"); }else{ nslog(@"不是模拟器"); }
三十六、真机测试报 tcweibosdk 93 duplicate symbols for architecture armv7
这是因为在项目中引用的两个相同的类库引起了,在我的项目中是因为引入的两个不同指令集引起的;
三十七、afnetworking报”request failed: unacceptable content-type: text/html”错误
afurlresponseserialization.m文件设置
self.acceptablecontenttypes = [nssetsetwithobjects:@"application/json", @"text/html",@"text/json",@"text/javascript", nil];
加上@”text/html”,部分,其实就是添加一种服务器返回的数据格式。
三十八、隐藏navigation跳转后的返回按钮
//隐藏头部左边的返回 self.navigationitem.hidesbackbutton=yes;
三十九、两种方法删除nsuserdefaults所有记录
//方法一 nsstring *appdomain = [[nsbundle mainbundle] bundleidentifier]; [[nsuserdefaults standarduserdefaults] removepersistentdomainforname:appdomain]; //方法二 - (void)resetdefaults { nsuserdefaults * defs = [nsuserdefaults standarduserdefaults]; nsdictionary * dict = [defs dictionaryrepresentation]; for (id key in dict) { [defs removeobjectforkey:key]; } [defs synchronize]; }
四十、uitableview设置section间距
在使用uitableviewstylegrouped类型的uitableview的时候,经常很奇怪的出现多余的section间距,那可能是因为你只设置了footer或者header的间距中的其中一个,那么另一个默认为20个高度,只需要设置返回0.001的cgflot的浮点数就可以解决这个多余的间距。
//header底部间距 - (cgfloat)tableview:(uitableview *)tableview heightforheaderinsection:(nsinteger)section { return 40;//section头部高度 } //footer底部间距 - (cgfloat)tableview:(uitableview *)tableview heightforfooterinsection:(nsinteger)section { return 0.001; }
四十一、nslog 输出格式集合
? %@ 对象 ? %d, %i 整数 ? %u 无符整形 ? %f 浮点/双字 ? %x, %x 二进制整数 ? %o 八进制整数 ? %zu size_t ? %p 指针 ? %e 浮点/双字 (科学计算) ? %g 浮点/双字 ? %s c 字符串 ? %.*s pascal字符串 ? %c 字符 ? %c unichar ? %lld 64位长整数(long long) ? %llu 无符64位长整数 %lf 64位双字
四十二、常用gcd总结
为了方便地使用gcd,苹果提供了一些方法方便我们将block放在主线程 或 后台线程执行,或者延后执行。使用的例子如下:
// 后台执行: dispatch_async(dispatch_get_global_queue(0, 0), ^{ // something }); // 主线程执行: dispatch_async(dispatch_get_main_queue(), ^{ // something }); // 一次性执行: static dispatch_once_t oncetoken; dispatch_once(&oncetoken, ^{ // code to be executed once }); // 延迟2秒执行: double delayinseconds = 2.0; dispatch_time_t poptime = dispatch_time(dispatch_time_now, delayinseconds * nsec_per_sec); dispatch_after(poptime, dispatch_get_main_queue(), ^(void){ // code to be executed on the main queue after delay });
dispatch_queue_t 也可以自己定义,如要要自定义queue,可以用dispatch_queue_create方法,示例如下:
dispatch_queue_t urls_queue = dispatch_queue_create("blog.devtang.com", null); dispatch_async(urls_queue, ^{ // your code }); dispatch_release(urls_queue);
另外,gcd还有一些高级用法,例如让后台2个线程并行执行,然后等2个线程都结束后,再汇总执行结果。这个可以用dispatch_group, dispatch_group_async 和 dispatch_group_notify来实现,示例如下:
dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{ // 并行执行的线程一 }); dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{ // 并行执行的线程二 }); dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{ // 上面的线程走完成后,最后通知走次block,保证这部分代码最后执行 });
四十三、 ios中的随机数
生成0-x之间的随机正整数
int value =arc4random_uniform(x + 1);
生成随机正整数
int value = arc4random()
通过arc4random() 获取0到x-1之间的整数的代码如下:
int value = arc4random() % x;
获取1到x之间的整数的代码如下:
int value = (arc4random() % x) + 1;
最后如果想生成一个浮点数,可以在项目中定义如下宏:
#define arc4random_max 0x100000000
然后就可以使用arc4random() 来获取0到100之间浮点数了(精度是rand()的两倍),代码如下:
double val = floorf(((double)arc4random() / arc4random_max) * 100.0f);
四十四、系统自带的uitableviewcell,其中cell.accessoryview可以自定义控件
if (indexpath.section == 2 && indexpath.row == 0) { cell.accessoryview = [[uiswitch alloc] init]; } else { cell.accessorytype = uitableviewcellaccessorydisclosureindicator; }
四十五、iskindofclass, ismemberofclass的用法区分
-(bool) iskindofclass: classobj判断是否是这个类或者这个类的子类的实例
-(bool) ismemberofclass: classobj 判断是否是这个类的实例
实例一:
person *person = [[person alloc] init]; //父类 teacher *teacher = [[teacher alloc] init]; //子类 //yes if ([teacher ismemberofclass:[teacher class]]) { nslog(@"teacher teacher类的成员"); } //no if ([teacher ismemberofclass:[person class]]) { nslog(@"teacher person类的成员"); } //no if ([teacher ismemberofclass:[nsobject class]]) { nslog(@"teacher nsobject类的成员"); }
实例二:
person *person = [[person alloc] init]; teacher *teacher = [[teacher alloc] init]; //yes if ([teacher iskindofclass:[teacher class]]) { nslog(@"teacher 是 teacher类或teacher的子类"); } //yes if ([teacher iskindofclass:[person class]]) { nslog(@"teacher 是 person类或person的子类"); } //yes if ([teacher iskindofclass:[nsobject class]]) { nslog(@"teacher 是 nsobject类或nsobject的子类"); }
ismemberofclass判断是否是属于这类的实例,是否跟父类有关系他不管,所以ismemberofclass指到父类时才会为no;
四十六、关于uiscreen
uiscreen对象包含了整个屏幕的边界矩形。当构造应用的用户界面接口时,你应该使用该对象的属性来获得推荐的矩形大小,用以构造你的程序窗口。
cgrect bound = [[uiscreen mainscreen] bounds]; // 返回的是带有状态栏的rect
cgrect frame = [[uiscreen mainscreen] applicationframe]; // 返回的是不带有状态栏的rect
float scale = [[uiscreen mainscreen] scale]; // 得到设备的自然分辨率
对于scale属性需要做进一步的说明:
以前的iphone 设备屏幕分辨率都是320*480,后来apple 在iphone 4中采用了名为retina的显示技术,iphone 4采用了960x640像素分辨率的显示屏幕。由于屏幕大小没有变,还是3.5英寸,分辨率的提升将iphone 4的显示分辨率提升至iphone 3gs的四倍,每英寸的面积里有326个像素。
scale属性的值有两个:
scale = 1; 的时候是代表当前设备是320*480的分辨率(就是iphone4之前的设备)
scale = 2; 的时候是代表分辨率为640*960的分辨率
// 判断屏幕类型,普通还是视网膜 float scale = [[uiscreen mainscreen] scale]; if (scale == 1) { bisretina = no; nslog(@"普通屏幕"); }else if (scale == 2) { bisretina = yes; nslog(@"视网膜屏幕"); }else{ nslog(@"unknow screen mode !"); }
四十七、uiview的clipstobounds属性
view2添加view1到中,如果view2大于view1,或者view2的坐标不全在view1的范围内,view2是盖着view1的,意思就是超出的部份也会画出来,uiview有一个属性,clipstobounds 默认情况下是no。如果,我们想要view2把超出的那部份现实出来,就得改变它的父视图也就view1的clipstobounds属性值。view1.clipstobounds = yes;
可以很好地解决覆盖的问题
四十八、百度坐标跟火星坐标相互转换
//百度转火星坐标 + (cllocationcoordinate2d )bdtoggencrypt:(cllocationcoordinate2d)coord { double x = coord.longitude - 0.0065, y = coord.latitude - 0.006; double z = sqrt(x * x + y * y) - 0.00002 * sin(y * m_pi); double theta = atan2(y, x) - 0.000003 * cos(x * m_pi); cllocationcoordinate2d transformlocation ; transformlocation.longitude = z * cos(theta); transformlocation.latitude = z * sin(theta); return transformlocation; } //火星坐标转百度坐标 + (cllocationcoordinate2d )ggtobdencrypt:(cllocationcoordinate2d)coord { double x = coord.longitude, y = coord.latitude; double z = sqrt(x * x + y * y) + 0.00002 * sin(y * m_pi); double theta = atan2(y, x) + 0.000003 * cos(x * m_pi); cllocationcoordinate2d transformlocation ; transformlocation.longitude = z * cos(theta) + 0.0065; transformlocation.latitude = z * sin(theta) + 0.006; return transformlocation; }
四十九、绘制1像素的线
#define single_line_width (1 / [uiscreen mainscreen].scale) #define single_line_adjust_offset ((1 / [uiscreen mainscreen].scale) / 2)
代码如下:
uiview *view = [[uiview alloc] initwithframe:cgrect(x - single_line_adjust_offset, 0, single_line_width, 100)];
注意:如果线宽为偶数point的话,则不要去设置偏移,否则线条也会失真
五十、uilabel显示html文本(ios7以上)
nsstring * htmlstring = @""; nsattributedstring * attrstr = [[nsattributedstring alloc] initwithdata:[htmlstring datausingencoding:nsunicodestringencoding] options:@{ nsdocumenttypedocumentattribute: nshtmltextdocumenttype } documentattributes:nil error:nil]; uilabel * mylabel = [[uilabel alloc] initwithframe:self.view.bounds]; mylabel.attributedtext = attrstr; [self.view addsubview:mylabel];
五十一、添加pch文件的步聚
1:创建新文件 ios->other->pch file,创建一个pch文件:“工程名-prefix.pch”: 2:将building setting中的precompile header选项的路径添加“$(srcroot)/项目名称/pch文件名”(例如:$(srcroot)/lotteryfive/lotteryfive-prefix.pch) 3:将precompile prefix header为yes,预编译后的pch文件会被缓存起来,可以提高编译速度
五十二、兼容字体大小6plue跟它以下的区别
#define font_compatible_screen_offset(_fontsize_) [uifont systemfontofsize:(_fontsize_ *([uiscreen mainscreen].scale) / 2)] 在iphone4~6中,缩放因子scale=2;在iphone6+中,缩放因子scale=3 运用时: mylabel.font=font_compatible_screen_offset(15);
五十三、app虚拟器可以运行,在真机调试时报这个问题,因为把项目名称设成中文导致
app installation failed
there was an internal api error.
build settings中的packaging的product name设置成中文
五十四、关于masonry
a:make.equalto 或 make.greaterthanorequalto (至多) 或 make.lessthanorequalto(至少) make.left.greaterthanorequalto(label); make.left.greaterthanorequalto(label.mas_left); //width >= 200 && width <= 400 make.width.greaterthanorequalto(@200); make.width.lessthanorequalto(@400) b:masequalto 和 equalto 区别:masequalto 比equalto多了类型转换操作,一般来说,大多数时候两个方法都是 通用的,但是对于数值元素使用mas_equalto。对于对象或是多个属性的处理,使用equalto。特别是多个属性时,必须使用equalto c:一些简便赋值 // make top = superview.top + 5, left = superview.left + 10, // bottom = superview.bottom - 15, right = superview.right - 20 make.edges.equalto(superview).insets(uiedgeinsetsmake(5, 10, 15, 20)) // make width and height greater than or equal to titlelabel make.size.greaterthanorequalto(titlelabel) // make width = superview.width + 100, height = superview.height - 50 make.size.equalto(superview).sizeoffset(cgsizemake(100, -50)) // make centerx = superview.centerx - 5, centery = superview.centery + 10 make.center.equalto(superview).centeroffset(cgpointmake(-5, 10)) d:and关键字运用 make.left.right.and.bottom.equalto(superview); make.top.equalto(otherview); e:优先;优先权(.priority,.priorityhigh,.prioritymedium,.prioritylow) .priority允许您指定一个确切的优先级 .priorityhigh 等价于uilayoutprioritydefaulthigh .prioritymedium 介于高跟低之间 .prioritylow 等价于uilayoutprioritydefaultlow 实例: make.left.greaterthanorequalto(label.mas_left).with.prioritylow(); make.top.equalto(label.mas_top).with.priority(600); g:使用mas_makeconstraints创建constraint后,你可以使用局部变量或属性来保存以便下次引用它;如果创建多个constraints,你可以采用数组来保存它们 // 局部或者全局 @property (nonatomic, strong) masconstraint *topconstraint; // 创建约束并赋值 [view1 mas_makeconstraints:^(masconstraintmaker *make) { self.topconstraint = make.top.equalto(superview.mas_top).with.offset(padding.top); make.left.equalto(superview.mas_left).with.offset(padding.left); }]; // 过后可以直接访问self.topconstraint [self.topconstraint uninstall]; h:mas_updateconstraints更新约束,有时你需要更新constraint(例如,动画和调试)而不是创建固定constraint,可以使用mas_updateconstraints方法 - (void)updateconstraints { [self.growingbutton mas_updateconstraints:^(masconstraintmaker *make) { make.center.equalto(self); make.width.equalto(@(self.buttonsize.width)).prioritylow(); make.height.equalto(@(self.buttonsize.height)).prioritylow(); make.width.lessthanorequalto(self); make.height.lessthanorequalto(self); }]; //调用父updateconstraints [super updateconstraints]; } i:mas_remakeconstraints更新约束,mas_remakeconstraints与mas_updateconstraints比较相似,都是更新constraint。不过,mas_remakeconstraints是删除之前constraint,然后再添加新的constraint(适用于移动动画);而mas_updateconstraints只是更新constraint的值。 - (void)changebuttonposition { [self.button mas_remakeconstraints:^(masconstraintmaker *make) { make.size.equalto(self.buttonsize); if (topleft) { make.top.and.left.offset(10); } else { make.bottom.and.right.offset(-10); } }]; }
五十五、ios中的round/roundf/ceil/ceilf/floor/floorf
round:如果参数是小数,则求本身的四舍五入。
ceil:如果参数是小数,则求最小的整数但不小于本身(向上取,ceil的英文意思有天花板的意思)
floor:如果参数是小数,则求最大的整数但不大于本身(向下取,floor的英文意思有地板的意思)
example:如果值是3.4的话,则
3.4 – round 3.000000
– ceil 4.000000
– floor 3.00000
五十六、中文输入法的键盘上有联想、推荐的功能,所以可能导致文本内容长度上有些不符合预期,导致越界
*terminating app due to uncaught exception ‘nsrangeexception’, reason: ‘nsmutablerlearray replaceobjectsinrange:withobject:length:: out of bounds’
处理方式如下(textview.markedtextrange == nil)
- (bool)textview:(uitextview *)textview shouldchangetextinrange:(nsrange)range replacementtext:(nsstring *)text { if (textview.text.length >= self.textlengthlimit && text.length > range.length) { return no; } return yes; } - (void)textviewdidchange:(uitextview *)textview { self.placeholder.hidden = (self.textview.text.length > 0); if (textview.markedtextrange == nil && self.textlengthlimit > 0 && self.text.length > self.textlengthlimit) { textview.text = [textview.text substringtoindex:self.textlengthlimit]; } }
五十七、关于导航栏透明度的设置及顶部布局起点位置设置
属性:translucent
关闭
self.navigationcontroller.navigationbar.translucent = no;
开启
self.navigationcontroller.navigationbar.translucent = yes;
属性:automaticallyadjustsscrollviewinsets
当 automaticallyadjustsscrollviewinsets 为 no 时,tableview 是从屏幕的最上边开始,也就是被 导航栏 & 状态栏覆盖
当 automaticallyadjustsscrollviewinsets 为 yes 时,也是默认行为
五十八、uiscrollview偏移64问题
在一个vc里如果第一个控件是uiscrollview,注意是第一个控件,就是首先addsubview在vc.view上。接着加到scrollview上的view就会在y点上发生64的偏移(也就是navigationbar的高度44+电池条的高度20)。
这个在ios7以后才会出现。
解决办法:
self.automaticallyadjustsscrollviewinsets = false; self是你当前那个vc。
如果这个scrollview不是第一个加到self.view上的。也不会发生64的偏移。
五十九、uiwebview在ios9下底部出现黑边解决方式
uiwebview底部的黑条很难看(在ios8下不会,在ios9会出现),特别是在底部还有透明控件的时候,隐藏的做法其实很简单,只需要将opaque设为no,背景色设为clearcolor即可
六十、tabbarcontroller跳转到另一个一级页面
当我们用tabbarcontroller时,若已经到其中一个tabbar的子页,又要跳转到某一个一级的页面时,如果这样写,导致底部出现黑边,引起tabbar消失的bug
[self.navigationcontroller poptorootviewcontrolleranimated:yes]; ((appdelegate *)appdelegateinstance).tabbarcontroller.selectedindex = 2;
解决方法一:删除动画
[self.navigationcontroller poptorootviewcontrolleranimated:no]; ((appdelegate *)appdelegateinstance).tabbarcontroller.selectedindex = 2;
解决方法二:延迟执行另一个系统操作
[self.navigationcontroller poptorootviewcontrolleranimated:no]; dispatch_after(dispatch_time(dispatch_time_now, (int64_t)(0.5 * nsec_per_sec)), dispatch_get_main_queue(), ^{ ((appdelegate *)appdelegateinstance).tabbarcontroller.selectedindex = 2; });
六十一、uiwebview获取html的标题title
titlelabel.text = [webview stringbyevaluatingjavascriptfromstring:@"document.title"];
六十二、汉字转为拼音
- (nsstring *)charactor:(nsstring *)astring getfirstcharactor:(bool)isgetfirst { //转成了可变字符串 nsmutablestring *str = [nsmutablestring stringwithstring:astring]; //先转换为带声调的拼音 cfstringtransform((cfmutablestringref)str,null, kcfstringtransformmandarinlatin,no); //再转换为不带声调的拼音 cfstringtransform((cfmutablestringref)str,null, kcfstringtransformmandarinlatin,no); cfstringtransform((cfmutablestringref)str, null, kcfstringtransformstripdiacritics, no); nsstring *pinyin = [str capitalizedstring]; //转化为大写拼音 if(isgetfirst) { //获取并返回首字母 return [pinyin substringtoindex:1]; } else { return pinyin; } }
六十三、属性名以new开头解决方式
因为new为oc关键词,类似的还有alloc
@property (nonatomic,copy) nsstring *new_passwd;
像上面这样写法会报错,可以替换成
@property (nonatomic,copy,getter = thenewpasswd) nsstring *new_passwd;
六十四、去除编译器警告
a:方法弃用告警
#pragma clang diagnostic push #pragma clang diagnostic ignored "-wdeprecated-declarations" //会报警告的方法,比如sel [testflight setdeviceidentifier:[[uidevice currentdevice] uniqueidentifier]]; #pragma clang diagnostic pop
b:未使用变量
#pragma clang diagnostic push #pragma clang diagnostic ignored "-wunused-variable" int a; #pragma clang diagnostic pop
六十五、self.navigationcontroller.viewcontrollers修改
主要解决那些乱七八糟的跳转逻辑,不按顺序来的问题;
var controllerarr = self.navigationcontroller?.viewcontrollers//获取controller数组 controllerarr?.removeall()//移除controllerarr中保存的历史路径 //重新添加新的路径 controllerarr?.append(self.navigationcontroller?.viewcontrollers[0]) controllerarr?.append(c) controllerarr?.append(b) //这时历史路径为(root -> c -> b) //将组建好的新的跳转路径 set进self.navigationcontroller里 self.navigationcontroller?.setviewcontrollers(controllerarr!, animated: true) //直接写入,完成跳转b页面的同时修改了之前的跳转路径
六十六、数组逆序遍历
1、枚举法
nsarray *array = @[@"1",@"2",@"3",@"5",@"6"]; [array enumerateobjectswithoptions:nsenumerationreverse usingblock:^(id _nonnull obj, nsuinteger idx, bool * _nonnull stop) { nslog(@"%@",obj); }];
2、for循环
nsarray*array=@[@"1",@"2",@"3",@"5",@"6"]; for (nsinteger index = array.count-1; index>=0; index--) { nslog(@"%@",array[index]); }
上一篇: 高中同学的邻居外号叫“狗锁”