iOS 知识-常用小技巧大杂烩

2016-06-02  本文已影响415人  UILabelkell
  1. 获取磁盘总空间大小
    <pre>//磁盘总空间

ifdef DEBUG

    NSLog(@"error: %@", error.localizedDescription);

endif

}else{
    NSNumber *number = [dic objectForKey:NSFileSystemSize];
    size = [number floatValue]/1024/1024;
}
return size;

}

</pre>

  1. 获取磁盘可用空间大小
    <pre>//磁盘可用空间

ifdef DEBUG

    NSLog(@"error: %@", error.localizedDescription);

endif

}else{
    NSNumber *number = [dic objectForKey:NSFileSystemFreeSize];
    size = [number floatValue]/1024/1024;
}
return size;

}

</pre>

  1. 获取指定路径下某个文件的大小
    <pre>//获取文件大小

</pre>

  1. 获取文件夹下所有文件的大小
    <pre>//获取文件夹下所有文件的大小

</pre>

  1. 获取字符串(或汉字)首字母
    <pre>//获取字符串(或汉字)首字母

</pre>

  1. 将字符串数组按照元素首字母顺序进行排序分组
    <pre>//将字符串数组按照元素首字母顺序进行排序分组

//获取字符串(或汉字)首字母

</pre>

  1. 获取当前时间
    <pre>//获取当前时间
    //format: @"yyyy-MM-dd HH:mm:ss"、@"yyyy年MM月dd日 HH时mm分ss秒"

</pre>

  1. 计算上次日期距离现在多久, 如 xx 小时前、xx 分钟前等
    <pre>/**

</pre>

  1. 判断手机号码格式是否正确
    <pre>//判断手机号码格式是否正确

</pre>


  1. 判断邮箱格式是否正确
    <pre>//利用正则表达式验证

</pre>

  1. 将十六进制颜色转换为 UIColor 对象
    <pre>//将十六进制颜色转换为 UIColor 对象

</pre>

  1. 对图片进行滤镜处理
    <pre>#pragma mark - 对图片进行滤镜处理
    // 怀旧 --> CIPhotoEffectInstant 单色 --> CIPhotoEffectMono
    // 黑白 --> CIPhotoEffectNoir 褪色 --> CIPhotoEffectFade
    // 色调 --> CIPhotoEffectTonal 冲印 --> CIPhotoEffectProcess
    // 岁月 --> CIPhotoEffectTransfer 铬黄 --> CIPhotoEffectChrome
    // CILinearToSRGBToneCurve, CISRGBToneCurveToLinear, CIGaussianBlur, CIBoxBlur, CIDiscBlur, CISepiaTone, CIDepthOfField

</pre>

  1. 对图片进行模糊处理
    <pre>#pragma mark - 对图片进行模糊处理
    // CIGaussianBlur ---> 高斯模糊
    // CIBoxBlur ---> 均值模糊(Available in iOS 9.0 and later)
    // CIDiscBlur ---> 环形卷积模糊(Available in iOS 9.0 and later)
    // CIMedianFilter ---> 中值模糊, 用于消除图像噪点, 无需设置radius(Available in iOS 9.0 and later)
    // CIMotionBlur ---> 运动模糊, 用于模拟相机移动拍摄时的扫尾效果(Available in iOS 9.0 and later)

</pre>

  1. 调整图片饱和度、亮度、对比度
    <pre>/**

*/

</pre>

  1. 创建一张实时模糊效果 View (毛玻璃效果)
    <pre>//Avilable in iOS 8.0 and later

</pre>

  1. 全屏截图
    <pre>//全屏截图

</pre>

  1. 截取一张 view 生成图片
    <pre>//截取view生成一张图片

</pre>

  1. 截取view中某个区域生成一张图片
    <pre>//截取view中某个区域生成一张图片

</pre>

  1. 压缩图片到指定尺寸大小
    <pre>//压缩图片到指定尺寸大小

</pre>

  1. 压缩图片到指定文件大小
    <pre>//压缩图片到指定文件大小

</pre>

  1. 获取设备 IP 地址

需要先引入下头文件:

Objective-C

1
2

import <ifaddrs.h>

import <arpa/inet.h>


<pre>//获取设备 IP 地址

</pre>


  1. 判断字符串中是否含有空格
    <pre>+ (BOOL)isHaveSpaceInString:(NSString *)string{
    NSRange _range = [string rangeOfString:@" "];
    if (_range.location != NSNotFound) {
    return YES;
    }else {
    return NO;
    }
    }

</pre>

  1. 判断字符串中是否含有某个字符串
    <pre>+ (BOOL)isHaveString:(NSString *)string1 InString:(NSString *)string2{
    NSRange _range = [string2 rangeOfString:string1];
    if (_range.location != NSNotFound) {
    return YES;
    }else {
    return NO;
    }
    }

</pre>

  1. 判断字符串中是否含有中文
    <pre>+ (BOOL)isHaveChineseInString:(NSString *)string{
    for(NSInteger i = 0; i < [string length]; i++){
    int a = [string characterAtIndex:i];
    if (a > 0x4e00 && a < 0x9fff) {
    return YES;
    }
    }
    return NO;
    }

</pre>

  1. 判断字符串是否全部为数字
    <pre>+ (BOOL)isAllNum:(NSString *)string{
    unichar c;
    for (int i=0; i<string.length; i++) {
    c=[string characterAtIndex:i];
    if (!isdigit(c)) {
    return NO;
    }
    }
    return YES;
    }

</pre>

  1. 绘制虚线
    <pre>/*
    ** lineFrame: 虚线的 frame
    ** length: 虚线中短线的宽度
    ** spacing: 虚线中短线之间的间距
    ** color: 虚线中短线的颜色
    */

</pre>
1,打印View所有子视图
<pre>po [[self view]recursiveDescription]</pre>

2,layoutSubviews调用的调用时机

<pre>* 当视图第一次显示的时候会被调用

3,NSString过滤特殊字符
<pre>// 定义一个特殊字符的集合
NSCharacterSet set = [NSCharacterSet characterSetWithCharactersInString:
@"@/:;()¥「」"、[]{}#%-
+=|~<>$ۥ'@#$%&*()+'""];
// 过滤字符串的特殊字符
NSString *newString = [trimString stringByTrimmingCharactersInSet:set];</pre>

4,TransForm属性
<pre>//平移按钮
CGAffineTransform transForm = self.buttonView.transform;
self.buttonView.transform = CGAffineTransformTranslate(transForm, 10, 0);

//旋转按钮
CGAffineTransform transForm = self.buttonView.transform;
self.buttonView.transform = CGAffineTransformRotate(transForm, M_PI_4);

//缩放按钮
self.buttonView.transform = CGAffineTransformScale(transForm, 1.2, 1.2);

//初始化复位
self.buttonView.transform = CGAffineTransformIdentity;</pre>

5,去掉分割线多余15像素
<pre>首先在viewDidLoad方法加入以下代码:
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
然后在重写willDisplayCell方法

define TICK CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();

define TOCK NSLog(@"Time: %f", CFAbsoluteTimeGetCurrent() - start)</pre>

7,Color颜色宏定义
<pre>// 随机颜色

define RANDOM_COLOR [UIColor colorWithRed:arc4random_uniform(256) / 255.0 green:arc4random_uniform(256) / 255.0 blue:arc4random_uniform(256) / 255.0 alpha:1]

// 颜色(RGB)

define RGBCOLOR(r, g, b) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1]

// 利用这种方法设置颜色和透明值,可不影响子视图背景色

define RGBACOLOR(r, g, b, a) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:(a)]

</pre>

8,Alert提示宏定义
<pre>- (void)exitApplication {
AppDelegate *app = [UIApplication sharedApplication].delegate;
UIWindow *window = app.window;

[UIView animateWithDuration:1.0f animations:^{
    window.alpha = 0;
} completion:^(BOOL finished) {
    exit(0);
}];

}</pre>

9,NSArray 快速求总和 最大值 最小值 和 平均值
<pre>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(@"%fn%fn%fn%f",sum,avg,max,min);
</pre>

10修改Label中不同文字颜色
<pre>- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[self editStringColor:self.label.text editStr:@"好" color:[UIColor blueColor]];
}

10,播放声音
<pre>#import
// 1.获取音效资源的路径
NSString *path = [[NSBundle mainBundle]pathForResource:@"pour_milk" ofType:@"wav"];
// 2.将路劲转化为url
NSURL *tempUrl = [NSURL fileURLWithPath:path];
// 3.用转化成的url创建一个播放器
NSError *error = nil;
AVAudioPlayer *play = [[AVAudioPlayer alloc]initWithContentsOfURL:tempUrl error:&error];
self.player = play;
// 4.播放
[play play];</pre>

11检测是否IPad Pro和其它设备型号
<pre>- (BOOL)isIpadPro
{
UIScreen *Screen = [UIScreen mainScreen];
CGFloat width = Screen.nativeBounds.size.width/Screen.nativeScale;
CGFloat height = Screen.nativeBounds.size.height/Screen.nativeScale;
BOOL isIpad =[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad;
BOOL hasIPadProWidth = fabs(width - 1024.f) = 8.0)</pre>

12修改Tabbar Item的属性
// 修改标题位置
self.tabBarItem.titlePositionAdjustment = UIOffsetMake(0, -10);
// 修改图片位置
self.tabBarItem.imageInsets = UIEdgeInsetsMake(-3, 0, 3, 0);

// 批量修改属性
for (UIBarItem *item in self.tabBarController.tabBar.items) {
    [item setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
             [UIFont fontWithName:@"Helvetica" size:19.0], NSFontAttributeName, nil]
                        forState:UIControlStateNormal];
}

// 设置选中和未选中字体颜色
[[UITabBar appearance] setShadowImage:[[UIImage alloc] init]];

//未选中字体颜色
[[UITabBarItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor]} forState:UIControlStateNormal];

//选中字体颜色
[[UITabBarItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor cyanColor]} forState:UIControlStateSelected];

12,NULL – nil – Nil – NSNULL的区别
<pre>* nil是OC的,空对象,地址指向空(0)的对象。对象的字面零值

12,控件不能交互的一些原因
<pre>1,控件的userInteractionEnabled = NO
2,透明度小于等于0.01,aplpha
3,控件被隐藏的时候,hidden = YES
4,子视图的位置超出了父视图的有效范围,子视图无法交互,设置了。
5,需要交互的视图,被其他视图盖住(其他视图开启了用户交互)。</pre>

12,修改UITextField中Placeholder的文字颜色
<pre>[text setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
}</pre>

13,视图的生命周期
<pre>1、 alloc 创建对象,分配空间
2、 init (initWithNibName) 初始化对象,初始化数据
3、 loadView 从nib载入视图 ,除非你没有使用xib文件创建视图
4、 viewDidLoad 载入完成,可以进行自定义数据以及动态创建其他控件
5、 viewWillAppear视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6、 viewDidAppear 视图已在屏幕上渲染完成

1、viewWillDisappear 视图将被从屏幕上移除之前执行
2、viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放.

viewVillUnload- 当内存过低,即将释放时调用;
viewDidUnload-当内存过低,释放一些不需要的视图时调用。</pre>

14,应用程序的生命周期
<pre>1,启动但还没进入状态保存 :

2,基本完成程序准备开始运行:

3,当应用程序将要入非活动状态执行,应用程序不接收消息或事件,比如来电话了:

4,当应用程序入活动状态执行,这个刚好跟上面那个方法相反:

5,当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可:

6,当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反:

7,当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作:

16,判断对象是否遵循了某协议
<pre>if ([self.selectedController conformsToProtocol:@protocol(RefreshPtotocol)]) {
[self.selectedController performSelector:@selector(onTriggerRefresh)];
}</pre>

17,页面强制横屏
<pre>#pragma mark - 强制横屏代码

18,系统键盘通知消息
<pre>1、UIKeyboardWillShowNotification-将要弹出键盘
2、UIKeyboardDidShowNotification-显示键盘
3、UIKeyboardWillHideNotification-将要隐藏键盘
4、UIKeyboardDidHideNotification-键盘已经隐藏
5、UIKeyboardWillChangeFrameNotification-键盘将要改变frame
6、UIKeyboardDidChangeFrameNotification-键盘已经改变frame</pre>

19,关闭navigationController的滑动返回手势
<pre>self.navigationController.interactivePopGestureRecognizer.enabled = NO;</pre>
20,设置状态栏背景为任意的颜色
<pre>- (void)setStatusColor
{
UIView *statusBarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,[UIScreen mainScreen].bounds.size.width, 20)];
statusBarView.backgroundColor = [UIColor orangeColor];
[self.view addSubview:statusBarView];
}</pre>

22,Label行间距
<pre>-(void)test{
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;
}
</pre>
23,UIImageView填充模式
<pre>@"UIViewContentModeScaleToFill", // 拉伸自适应填满整个视图
@"UIViewContentModeScaleAspectFit", // 自适应比例大小显示
@"UIViewContentModeScaleAspectFill", // 原始大小显示
@"UIViewContentModeRedraw", // 尺寸改变时重绘
@"UIViewContentModeCenter", // 中间
@"UIViewContentModeTop", // 顶部
@"UIViewContentModeBottom", // 底部
@"UIViewContentModeLeft", // 中间贴左
@"UIViewContentModeRight", // 中间贴右
@"UIViewContentModeTopLeft", // 贴左上
@"UIViewContentModeTopRight", // 贴右上
@"UIViewContentModeBottomLeft", // 贴左下
@"UIViewContentModeBottomRight", // 贴右下</pre>

24,宏定义检测block是否可用
<pre>#define BLOCK_EXEC(block, ...) if (block) { block(VA_ARGS); };
// 宏定义之前的用法
if (completionBlock) {
completionBlock(arg1, arg2);
}
// 宏定义之后的用法
BLOCK_EXEC(completionBlock, arg1, arg2);</pre>

25,Debug栏打印时自动把Unicode编码转化成汉字
<pre>// 有时候我们在xcode中打印中文,会打印出Unicode编码,还需要自己去一些在线网站转换,有了插件就方便多了。
DXXcodeConsoleUnicodePlugin 插件</pre>

26,设置状态栏文字样式颜色
<pre>[[UIApplication sharedApplication] setStatusBarHidden:NO];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];</pre>

26,自动生成模型代码的插件
<pre>
可自动生成模型的代码,省去写模型代码的时间
ESJsonFormat-for-Xcode</pre>

27,iOS中的一些手势
<pre>轻击手势(TapGestureRecognizer)
轻扫手势(SwipeGestureRecognizer)
长按手势(LongPressGestureRecognizer)
拖动手势(PanGestureRecognizer)
捏合手势(PinchGestureRecognizer)
旋转手势(RotationGestureRecognizer)</pre>

27,iOS 开发中一些相关的路径
<pre>模拟器的位置:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs

文档安装位置:
/Applications/Xcode.app/Contents/Developer/Documentation/DocSets

插件保存路径:
~/Library/ApplicationSupport/Developer/Shared/Xcode/Plug-ins

自定义代码段的保存路径:
~/Library/Developer/Xcode/UserData/CodeSnippets/
如果找不到CodeSnippets文件夹,可以自己新建一个CodeSnippets文件夹。

证书路径
~/Library/MobileDevice/Provisioning Profiles
</pre>
28,获取 iOS 路径的方法
<pre>获取家目录路径的函数
NSString *homeDir = NSHomeDirectory();

获取Documents目录路径的方法
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];

获取Documents目录路径的方法
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];

获取tmp目录路径的方法:
NSString *tmpDir = NSTemporaryDirectory();</pre>

29,字符串相关操作
<pre>去除所有的空格
[str stringByReplacingOccurrencesOfString:@" " withString:@""]

去除首尾的空格
[str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

31,MRC和ARC混编设置方式
<pre>在XCode中targets的build phases选项下Compile Sources下选择 不需要arc编译的文件
双击输入 -fno-objc-arc 即可

MRC工程中也可以使用ARC的类,方法如下:
在XCode中targets的build phases选项下Compile Sources下选择要使用arc编译的文件
双击输入 -fobjc-arc 即可</pre>

32,把tableview里cell的小对勾的颜色改成别的颜色
<pre>_mTableView.tintColor = [UIColor redColor];</pre>
33,调整tableview的separaLine线的位置
<pre>tableView.separatorInset = UIEdgeInsetsMake(0, 100, 0, 0);
</pre>

34,设置滑动的时候隐藏navigation bar

navigationController.hidesBarsOnSwipe = Yes

35,自动处理键盘事件,实现输入框防遮挡的插件
IQKeyboardManager
https://github.com/hackiftekhar/IQKeyboardManager

36,Quartz2D相关

<pre>图形上下是一个CGContextRef类型的数据。
图形上下文包含:
1,绘图路径(各种各样图形)
2,绘图状态(颜色,线宽,样式,旋转,缩放,平移)
3,输出目标(绘制到什么地方去?UIView、图片)

1,获取当前图形上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
2,添加线条
CGContextMoveToPoint(ctx, 20, 20);
3,渲染
CGContextStrokePath(ctx);
CGContextFillPath(ctx);
4,关闭路径
CGContextClosePath(ctx);
5,画矩形
CGContextAddRect(ctx, CGRectMake(20, 20, 100, 120));
6,设置线条颜色
[[UIColor redColor] setStroke];
7, 设置线条宽度
CGContextSetLineWidth(ctx, 20);
8,设置头尾样式
CGContextSetLineCap(ctx, kCGLineCapSquare);
9,设置转折点样式
CGContextSetLineJoin(ctx, kCGLineJoinBevel);
10,画圆
CGContextAddEllipseInRect(ctx, CGRectMake(30, 50, 100, 100));
11,指定圆心
CGContextAddArc(ctx, 100, 100, 50, 0, M_PI * 2, 1);
12,获取图片上下文
UIGraphicsGetImageFromCurrentImageContext();
13,保存图形上下文
CGContextSaveGState(ctx)
14,恢复图形上下文
CGContextRestoreGState(ctx)</pre>

37,屏幕截图
<pre> // 1. 开启一个与图片相关的图形上下文
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size,NO,0.0);

// 2. 获取当前图形上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();

// 3. 获取需要截取的view的layer
[self.view.layer renderInContext:ctx];

// 4. 从当前上下文中获取图片
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

// 5. 关闭图形上下文
UIGraphicsEndImageContext();

// 6. 把图片保存到相册
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);</pre>

37,左右抖动动画
<pre>//1, 创建核心动画
CAKeyframeAnimation *keyAnima = [CAKeyframeAnimation animation];

//2, 告诉系统执行什么动画。
keyAnima.keyPath = @"transform.rotation";
keyAnima.values = @[@(-M_PI_4 /90.0 * 5),@(M_PI_4 /90.0 * 5),@(-M_PI_4 /90.0 * 5)];

// 3, 执行完之后不删除动画
keyAnima.removedOnCompletion = NO;

// 4, 执行完之后保存最新的状态
keyAnima.fillMode = kCAFillModeForwards;

// 5, 动画执行时间
keyAnima.duration = 0.2;

// 6, 设置重复次数。
keyAnima.repeatCount = MAXFLOAT;

// 7, 添加核心动画
[self.iconView.layer addAnimation:keyAnima forKey:nil];</pre>
38,CALayer 的知识
<pre>CALayer 负责视图中显示内容和动画
UIView 负责监听和响应事件

创建UIView对象时,UIView内部会自动创建一个图层(既CALayer)
UIView本身不具备显示的功能,是它内部的层才有显示功能.

CALayer属性:
position 中点(由anchorPoint决定)
anchorPoint 锚点
borderColor 边框颜色
borderWidth 边框宽度
cornerRadius 圆角半径
shadowColor 阴影颜色
contents 内容
opacity 透明度
shadowOpacity 偏移
shadowRadius 阴影半径
shadowColor 阴影颜色
masksToBounds 裁剪</pre>

39,性能相关
<pre>1. 视图复用,比如UITableViewCell,UICollectionViewCell.

  1. 数据缓存,比如用SDWebImage实现图片缓存。
  2. 任何情况下都不能堵塞主线程,把耗时操作尽量放到子线程。
  3. 如果有多个下载同时并发,可以控制并发数。
  4. 在合适的地方尽量使用懒加载。
  5. 重用重大开销对象,比如:NSDateFormatter、NSCalendar。
  6. 选择合适的数据存储。
  7. 避免循环引用。避免delegate用retain、strong修饰,block可能导致循环引用,NSTimer也可能导致内存泄露等。
  8. 当涉及到定位的时候,不用的时候最好把定位服务关闭。因为定位耗电、流量。
  9. 加锁对性能有重大开销。
  10. 界面最好不要添加过多的subViews.
  11. TableView 如果不同行高,那么返回行高,最好做缓存。
  12. Viewdidload 里尽量不要做耗时操作。</pre>

40,验证身份证号码
<pre>//验证身份证号码

2> 然后启动“消息循环”监听所有的事件

3> 当用户触摸屏幕的时候, "消息循环"监听到这个触摸事件

4> "消息循环" 首先把监听到的触摸事件传递了 UIApplication 对象

5> UIApplication 对象再传递给 UIWindow 对象

6> UIWindow 对象再传递给 UIWindow 的根控制器(rootViewController)

7> 控制器再传递给控制器所管理的 view

8> 控制器所管理的 View 在其内部搜索看本次触摸的点在哪个控件的范围内(调用Hit test检测是否在这个范围内)

9> 找到某个控件以后(调用这个控件的 touchesXxx 方法), 再一次向上返回, 最终返回给"消息循环"

10> "消息循环"知道哪个按钮被点击后, 在搜索这个按钮是否注册了对应的事件, 如果注册了, 那么就调用这个"事件处理"程序。(一般就是执行控制器中的"事件处理"方法)</pre>

42,使用函数式指针执行方法和忽略performSelector方法的时候警告
<pre>不带参数的:
SEL selector = NSSelectorFromString(@"someMethod");
IMP imp = [_controller methodForSelector:selector];
void (*func)(id, SEL) = (void *)imp;
func(_controller, selector);

带参数的:
SEL selector = NSSelectorFromString(@"processRegion:ofView:");
IMP imp = [_controller methodForSelector:selector];
CGRect (*func)(id, SEL, CGRect, UIView *) = (void *)imp;
CGRect result = func(_controller, selector, someRect, someView);

忽略警告:

pragma clang diagnostic push

pragma clang diagnostic ignored "-Warc-performSelector-leaks"

[someController performSelector: NSSelectorFromString(@"someMethod")]

pragma clang diagnostic pop

如果需要忽视的警告有多处,可以定义一个宏:

define SuppressPerformSelectorLeakWarning(Stuff)

do {
_Pragma("clang diagnostic push")
_Pragma("clang diagnostic ignored "-Warc-performSelector-leaks"")
Stuff;
_Pragma("clang diagnostic pop")
} while (0)
使用方法:
SuppressPerformSelectorLeakWarning(
[_target performSelector:_action withObject:self]
);
</pre>

43,UIApplication的简单使用
<pre>--------设置角标数字--------
//获取UIApplication对象
UIApplication *ap = [UIApplication sharedApplication];
//在设置之前, 要注册一个通知,从ios8之后,都要先注册一个通知对象.才能够接收到提醒.
UIUserNotificationSettings *notice =
[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
//注册通知对象
[ap registerUserNotificationSettings:notice];
//设置提醒数字
ap.applicationIconBadgeNumber = 20;

--------设置联网状态--------
UIApplication *ap = [UIApplication sharedApplication];
ap.networkActivityIndicatorVisible = YES;</pre>

上一篇下一篇

猜你喜欢

热点阅读