【iOS 开发】常用方法和常见问题解决

这篇文章是写给自己看的,会将平时一些用得到但又不是特别常用的方法记录在这里,因为只是一些小方法,不至于每个都开一篇文章,所以就汇总在这里,有需要的朋友也可以收藏一下。


读取文件路径

1
2
3
4
5
6
7
8
/* 获取文件 URL 路径 */
NSURL *url = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"png"];
/* 获取文件 path 路径 */
NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"png"];
/* 获取 App 沙盒路径 */
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

按比例缩放尺寸来适配不同尺寸的屏幕

1
2
3
4
5
6
7
/* 得到屏幕尺寸 */
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
#define kScreenHeight [UIScreen mainScreen].bounds.size.height
/* 设置比例缩放 */
#define W(x) ((x)* kScreenWidth / 320.0)
#define H(y) ((y)* kScreenHeight / 568.0)

延迟执行的方法

以下三种方法效果相同,都是在三秒延迟后设置 self.label.text = @"标题";

1
2
/* 方式一(在当前线程 但不会卡住界面) */
[self.label performSelector:@selector(setText:) withObject:@"标题" afterDelay:3];
1
2
3
4
5
6
7
/* 方式二(在当前线程 但不会卡住界面) */
[self performSelector:@selector(set) withObject:nil afterDelay:3];
- (void)set {
self.label.text = @"标题";
}
1
2
3
4
5
/* 方式三(在其他线程) */
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^ {
self.label.text = @"标题";
});
1
2
/* 在当前线程 会卡住界面(一般只用作调试) */
[NSThread sleepForTimeInterval:3]; => sleep(3);

转换网址中的中文

1
2
3
4
/* 用于 GET 方式请求时,参数含有中文时的解决方法 */
NSString *str1 = @"http://apis.baidu.com/apistore/weatherservice/cityname=无锡";
NSString *str2 = [str1 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

根据类名创建视图控制器对象

1
UIViewController *viewController = [[NSClassFromString(vcName) alloc] init];

与用户的交互状态

1
2
/* 取消与用户的交互,界面上的控件都会失效(也可单独设置某控件,与 enabled 属性有区别) */
self.view.userInteractionEnabled = NO;

将控件显示在视图最前端

1
2
/* 会将该子视图放在所有子视图的最前面 */
[self.view bringSubviewToFront:self.button];

图片添加点击事件

有些人给图片添加点击事件时,会发现根本无效,其原因是因为 UIImageViewuserInteractionEnabled 属性默认是为 NO 的,所以添加了点击事件后,点击却没反应。

1
2
/* 图片想要点击事件必须设为YES,默认是NO */
self.imageView.userInteractionEnabled = YES;

SearchBar 或者 TextField 设置第一响应者

1
2
/* 就是进入页面直接进入编辑状态 */
[self.searchBar becomeFirstResponder];

自定义 Log 打印

1
2
3
4
5
6
7
/* 自定义 Log 打印 */
#ifdef DEBUG
#define DString [NSString stringWithFormat:@"%s", __FILE__].lastPathComponent
#define DLog(fmt, ...) NSLog((@"[%@ : %d 行] " fmt), DString, __LINE__, ##__VA_ARGS__)
#else
#define DLog(...)
#endif

获取当前设备系统版本号

1
2
/* 当前设备系统版本号 */
#define kDeviceSystemVersion [[UIDevice currentDevice].systemVersion doubleValue]

颜色转换为图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
颜色转换为图片
@param color 要转换的颜色
@return 转换后的图片
*/
+ (UIImage *)imageWithColor:(UIColor *)color {
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}

通过 storyboard 的 Identity 来查找对象

设置 Storyboard ID

1
2
3
4
5
6
/* 需设置要查找视图的ID */
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UITabBarController *tab = [storyboard instantiateViewControllerWithIdentifier:@"tab"];
/* 根据根视图查找 */
UITabBarController *tab = storyboard.instantiateInitialViewController;

全局引用头文件

$(SRCROOT)/2048/define.h 是相对路径,表示 2048 项目文件夹下的 define.h 文件。

Prefix Header

解决 iOS11 中 ScrollView 顶部白边和 TableView 刷新抖动的问题

1
2
3
4
5
6
7
// 解决 iOS11 中 ScrollView 顶部白边和 TableView 刷新抖动的问题
if (@available(iOS 11.0, *)) {
UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
UITableView.appearance.estimatedRowHeight = 0;
UITableView.appearance.estimatedSectionHeaderHeight = 0;
UITableView.appearance.estimatedSectionFooterHeight = 0;
}

将来的你,一定会感激现在拼命的自己,愿自己与读者的开发之路无限美好。

我的传送门: 博客简书微博GitHub

如果觉得我的文章对您有用,请随意打赏吧,您的支持将鼓励我继续创作!
0%