IOS 点滴技巧
来源:互联网 发布:欧美直播软件 编辑:程序博客网 时间:2024/06/07 02:51
①在非viewController页面想调用self.navigation的方法的方法
方法一:通过delegate
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];UINavigationController *navigation = (UINavigationController *)[appDelegate.window rootViewController];
方法二:如果有UITabBarViewController
UIViewController *viewC = [[UIViewController alloc]init]; // 取出当前的导航控制器 UITabBarController *tabBarVc = (UITabBarController *)[UIApplication sharedApplication].keyWindow.rootViewController; //The view controller associated with the currently selected tab item //当前选择的导航控制器 UINavigationController *navC = (UINavigationController *)tabBarVc.selectedViewController; [navC pushViewController:viewC animated:YES];方法三:如果是model出来的
UIViewController *viewC = [[UIViewController alloc]init]; //获取最终的根控制器 UIViewController *rootC = [UIApplication sharedApplication].keyWindow.rootViewController; //如果是modal出来的控制器,它就会通过presentedViewController拿到上一个控制器 UINavigationController *navC = (UINavigationController *)rootC.presentedViewController; [navC pushViewController:viewC animated:YES];
②tabelView的cell在一个屏幕可见的部分会绘画出来,当滑动的时候,并不会再重新new一个cell,而是通过调用方法dequeueReusableCellWithIdentifier重用已经滑出屏幕的cell,所以,这个时候要重新设置cell的某些属性,比如userInteractionEnabled,accessoryType
PS:还要记得清空被重用的cell的内容
③NSArray的内容重新按升序排列,得到的array就是排序过了的,传的firstArray是未排序的
// array sort NSComparator cmptr = ^(id obj1, id obj2){ if ([obj1 integerValue] > [obj2 integerValue]) { return (NSComparisonResult)NSOrderedDescending; } if ([obj1 integerValue] < [obj2 integerValue]) { return (NSComparisonResult)NSOrderedAscending; } return (NSComparisonResult)NSOrderedSame; }; NSArray *array = [firstArray sortedArrayUsingComparator:cmptr];
④为UIImageView添加单击事件
"imageView.userInteractionEnabled = YES;UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(yourHandlingCode:)];[imageView addGestureRecognizer:singleTap];"
⑤NSURL的编码
在由NSString生成NSURL对象时,有可能出现NSString中包含百分号各类括号冒号等对于url来说的非法字符如果直接进行转换的话将得到nil。在对复杂url进行转换前,可以对NSString先进行一下处理,将其转换为合法的url字符串。
NSString *changedStr = [inputStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
⑥带边框的UIImage缩放
一个带边框的UIImage如果使用常规的缩放,边框部分将被按照缩放比例拉伸或压缩,有些时候这并不是我们所期望的,可以使用
[[UIImage imageNamed:@"xxx.png"] stretchableImageWithLeftCapWidth:1 topCapHeight:1];以1px作为重复铺满拉伸区域来实现,但是在IOS5中,此方法已经被Deprecated了!!!
IOS5以降可以用以下的方法来更改上左下右四个方向的偏移量实现。
[[UIImage imageNamed:@"xxx.png”] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 16, 0, 16)];
⑦使用类要谨慎
IOS也已经经历了不少版本的变迁了,其中的类及方法都是有生命期限的。开发者不可能把每一个版本的新特性都记下来,在使用时一定要留一点心思。如果不确定当前的版本支不支持,或者要兼容一些低版本的话,就需要加入一些必须的判断,来保证程序的健壮性。
对于类来说,可以有一个不错的方法来判读,拿IOS8的新特性来说吧。UIAcctionSheet在IOS8中已经废止了,但IOS8以下还是可以使用了,那我们可以这样来做,以达到兼容的效果。UIAlertView也是类似的处理,尽管UIAlertView在IOS8下还是能正常显示(PS:在title为nil的场合下,message会继承title的font,解决的办法就是把title设@""即可)
Class class = NSClassFromString(@"UIAlertController"); if (class) { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"xxx" message:@"xxxxx" preferredStyle:UIAlertControllerStyleActionSheet]; [alert.view addSubview:yourView]; [alert addAction:[UIAlertAction actionWithTitle:@"xxx" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { // your selector }]]; [self presentViewController:alert animated:YES completion:nil]; } else { // ActionSheet UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"xxx" delegate:self cancelButtonTitle:nil destructiveButtonTitle:@"xxx" otherButtonTitles:nil]; [actionSheet addSubview:yourView]; [actionSheet showInView:self.view]; }
⑧颜色选取
十六进制转换成UIColor
UIColor* UIColorFromHex(NSInteger colorInHex) { // colorInHex should be value like 0xFFFFFF return [UIColor colorWithRed:((float) ((colorInHex & 0xFF0000) >> 16)) / 0xFF green:((float) ((colorInHex & 0xFF00) >> 8)) / 0xFF blue:((float) (colorInHex & 0xFF)) / 0xFF alpha:1.0];}颜色选取器
推荐一个独立的颜色选取器点我下载
一个插件,可以显示当前颜色的十六进制编码,点我下载 之后将HexColorPicker.colorPicker解压到至文件夹 [homefolder]/Library/ColorPickers/ 下(如果不存在,就手动创建)。再打开颜色选取器时,可以看到标签栏最右边多了一个#符号,点击即可看到当前颜色的十六进制值。
⑨Autolayout&SizeClasses
Auto Layout是自动布局的意思,通过Constraint(约束)和各项条件来计算出合理的布局.
抛弃以往旧的布局方式不再去关注View的Frame,Center,和autoresizing. 因为这些坐标和大小的定位都可以通过来Auto Layout完成.
在这儿发现两张好图
PS:如果写代码使用Autolayout,需要对使用的View的translatesAutoresizingMaskIntoConstraints的属性设置为NO.
即可开始通过代码添加Constraint,否则View还是会按照以往的autoresizingMask进行计算.
而在Interface Builder中勾选了Ues Autolayout,IB生成的控件的translatesAutoresizingMaskIntoConstraints属性都会被默认设置NO.
SizeClasses
⑩判断取得的图片格式
//通过图片Data数据第一个字节 来获取图片扩展名- (NSString *)contentTypeForImageData:(NSData *)data { uint8_t c; [data getBytes:&c length:1]; switch (c) { case 0xFF: return @"jpeg"; case 0x89: return @"png"; case 0x47: return @"gif"; case 0x49: case 0x4D: return @"tiff"; case 0x52: if ([data length] < 12) { return nil; } NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) { return @"webp"; } return nil; } return nil;}
图片数据的第一个字节是固定的,一种类型的图片第一个字节就是它的标识, 我们来调用一下这个方法:
//假设这是一个网络获取的URL NSString *path = @"http://pic.rpgsky.net/images/2016/07/26/3508cde5f0d29243c7d2ecbd6b9a30f1.png"; NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:path]]; //调用获取图片扩展名 NSString *string = [self contentTypeForImageData:data]; //输出结果为 png NSLog(@"%@",string);
- IOS 点滴技巧
- iOS开发技巧点滴
- iOS开发技巧点滴积累
- JNI使用技巧点滴
- JNI使用技巧点滴
- Delphi编程技巧点滴
- SQL语句技巧点滴
- JNI使用技巧点滴
- .NET 编程技巧点滴
- VC编程技巧点滴
- Flex 技巧点滴之一
- linux技巧点滴(一)
- javascript技巧点滴javascript
- Linux技巧点滴(二)
- JNI使用技巧点滴
- excel技巧点滴积累
- 论文写作点滴技巧
- latex点滴小技巧
- 输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )
- C++静态成员函数小结
- 打开并编辑ubuntu的root.disk文件,WinHex使用方法
- 从陌生到熟悉,再变成最熟悉的陌生人:伤感日志
- 配置多SessionFactory
- IOS 点滴技巧
- spring -quartz配置详解
- IIS 配置无后缀URL备忘
- 【木头Cocos2d-x 005】穷鬼之mac cocos2d-x环境搭建-成功!(VMWare + mac lion+xcode)
- cronExpression从页面定义生成
- 笔迹心理学
- ActiveReports 7.0报表控件版本比较
- 移除html格式:RemoveHTML()方法
- 自定义Dialog 简述