iOS开发小知识

1. 去除特定类型的警告信息
  • 先查看警告类型

当工程中有这种类型警告的时候,在警告窗口,某个警告上,我们右击,显示出右键菜单,选择其中的 Reveal in Log,

  • 其中 [-Wxxxxxxxxxx-xxxx-xxx],在这个括号中的就是 这种警告的类型 -W是前缀,这个前缀表示的是 打开这种类型的警告 如果我们是要关闭某种类型的警告的话, 要将 -W换成 -Wno-
  • 编译器提供的宏来操作
1
#pragma  clang diagnostic ignored "-Wmultichar"

整个工程去除某种警告信息:工程的target有一个 Other Warning Flags,在其中添加 -Wno-xxxxx-xx-xx-xx后,再重新编译即可.

2. UITableview去除空白表格
1
self.tableView.tableFooterView = [UIView new];
3.屏幕快照
1
- (UIImage *)getScreenShot { 
    UIGraphicsBeginImageContext(self.view.bounds.size); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image; 
}
4.设置系统状态栏
  • 可以在每个viewController中重写下面的方法
1
-(UIStatusBarStyle)preferredStatusBarStyle 
{ 
    return UIStatusBarStyleLightContent; 
}
  • 也可以使用UIApplication的statusBarStyle方法来设置状态栏,不过,首先需要停止使用View controller-based status bar appearance。在project target的Info tab中,插入一个新的key,名字为View controller-based status bar appearance,并将其值设置为NO。

5.设置导航栏背景颜色

在iOS 7之后,不再使用tintColor属性(这个属性可以用来设置UIBarButtonItem的颜色)来设置导航栏的颜色,而是使用barTintColor属性来修改背景色。

1
[[UINavigationBar appearance] setBarTintColor:[UIColor yellowColor]];

默认情况下,导航栏的translucent属性为YES。另外,系统还会对所有的导航栏做模糊处理,这样可以让iOS 7中导航栏的颜色更加饱和。

6.使用16进制颜色

在开发中,UI设计师经常给开发的颜色值往往都是用十六进制表示的,比如0xffaabb,这就需要我们进行转换后使用.

  • 方案一: 使用下面的宏定义

    1
    #define UIColorWithRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
    // 使用示例
    UIColor *color = UIColorWithRGB(0x23A5D3);
  • 方案二: 使用下面分类方法

    1
    + (UIColor *)colorWithHex:(NSString *)string{
        {
            NSString *cleanString = [string stringByReplacingOccurrencesOfString:@"#" withString:@""];
            if([cleanString length] == 3) {
                cleanString = [NSString stringWithFormat:@"%@%@%@%@%@%@",
                               [cleanString substringWithRange:NSMakeRange(0, 1)],[cleanString substringWithRange:NSMakeRange(0, 1)],
                               [cleanString substringWithRange:NSMakeRange(1, 1)],[cleanString substringWithRange:NSMakeRange(1, 1)],
                               [cleanString substringWithRange:NSMakeRange(2, 1)],[cleanString substringWithRange:NSMakeRange(2, 1)]];
            }
            if([cleanString length] == 6) {
                cleanString = [cleanString stringByAppendingString:@"ff"];
            }
    
            unsigned int baseValue;
            [[NSScanner scannerWithString:cleanString] scanHexInt:&baseValue];
    
            float red = ((baseValue >> 24) & 0xFF)/255.0f;
            float green = ((baseValue >> 16) & 0xFF)/255.0f;
            float blue = ((baseValue >> 8) & 0xFF)/255.0f;
    
            return [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
        }
    }
    // 使用示例
    UIColor *myColor = [UIColor colorWithHex:@"#1c3b2a"];
7.转换参照坐标系

一个UI控件的frame值,默认总是参照它的superView为坐标原点,但有时候我们需要获得到这个控件相对屏幕的坐标时,就需要进行坐标转换.

1
// 将按钮btn的frame值从父控件的左上角转换为window的左上角为原点进行计算,获得新的frame值
// toView的参数如果传nil,则代表应用的主窗口.
CGRect newFrame = [self.btn.superView convertRect:self.btn.frame toView:self.window];
// convertRect:fromView  同上取反即可:
CGRect newFrame1 = [self.window convertRect:self.btn.frame fromView:self.btn.superView];
// convertPoint:toView  同理
// convertPoint:fromView  同理
8.修改系统控件的readOnly属性值

使用KVC进行修改私有属性或者使用@property声明的(readOnly)的属性;

KVC中,keyPath可以层层寻找属性,key只能在当前的属性中查找.

9.打印输出字典和数组

我们在开发中经常会将数组或者字典中的内容打印出来进行查看,但如果有中文,往往会显示下面的情况

为了能够正常显示中文内容,只要下面的分类代码到项目中即可.

1
#import "NSArray+ZDLog.h"

@implementation NSArray (Log)
- (NSString *)descriptionWithLocale:(id)locale
{
    NSMutableString *strM = [NSMutableString stringWithString:@"(\n"];
    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        [strM appendFormat:@"\t%@,\n", obj];
    }];
    [strM appendString:@")"];
    return strM;
}
@end

@implementation NSDictionary (Log)
- (NSString *)descriptionWithLocale:(id)locale
{
    NSMutableString *strM = [NSMutableString stringWithString:@"{\n"];
    [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        [strM appendFormat:@"\t%@ = %@;\n", key, obj];
    }];
    [strM appendString:@"}\n"];
    return strM;
}
@end
10.KVC使用技巧

假设一个数组中存储了许多商品,我们需要将商品的名称提取出来,保存到另外一个数组中使用.通常的做法时先遍历商品数组,然后再获取商品对象的名称后,存到另外一个可变数组中,但使用KVC会更加简介,仅要下面这样的一行代码即可.

1
NSArray *productNames = [productsArray velueForKeyPath:@"name"];
11.scrollview限制滚动方向

当需要限制scrollview的水平或垂直不能滚动时,只需将该方向的值设置为0即可

1
self.scrollView.ContentSize = CGSizeMake(水平滚动距离值,垂直滚动距离值);
12. 禁止点击UIPageControl

UIPageControl默认是可以点击每个小圆点的,如果需要取消点击反应,只要不设置宽或高的尺子即可,这样UIpageControl依然可以显示,但不能响应点击事件.