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);