这里记录一些iOS开发常用的一些笔记,方便下次使用。
---------- 导航栏相关 ----------
- 全局设置导航栏返回按钮
//全局设置导航栏返回按钮颜色
[[UIBarButtonItem appearance] setTintColor:[UIColor blackColor]];
//全局设置导航栏返回按钮只带返回箭头 不带文字
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
//上面方法在iOS11之前可用,但是iOS11之后返回箭头也会向下面偏移一点距离。所以换一种方法,直接把文字的颜色设置为透明
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
- 设置导航栏标题
//self.title = @"标题"; 这样写有可能导致tabbarController的标题也发生改变
self.navigationItem.title = @"标题";
- 右滑pop功能
//关闭右滑pop功能 默认YES。
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
//如果自定义了leftBarButtonItem或者是隐藏了导航栏,右滑功能就会失效 添加下面代码实现右滑pop
self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
---------- UITableView ----------
- UITableViewStyle
UITableViewStylePlain, // regular table view常规表视图
UITableViewStyleGrouped // preferences style table view偏好样式表视图
区别:
UITableViewStylePlain:
1.有多个section时,区头会停留在顶部,不会和tableView一起滑动
2.没有头部和中间的间距。
UITableViewStyleGrouped:
1.区头不会停留在顶部,会随着tableView一起滑动
2.默认自带头部尾部距离和区间距。(去掉间距可设置tableView.tableHeaderView或tableView.tableFooterView或实现代理方法。注意设置的高度不能为零,为零的话,苹果会取默认值就无法消除头部间距了)
- 分割线
//隐藏分割线
tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
//分割线颜色
tableView.separatorColor = [UIColor redColor];
//tableView设置分割线位置(top, left, bottom, right)
tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0);
//cell也可以设置分割线位置
cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0);
- UITableViewCellStyle
UITableViewCellStyleDefault, // Simple cell with text label and optional image view (behavior of UITableViewCell in iPhoneOS 2.x)
UITableViewCellStyleValue1, // Left aligned label on left and right aligned label on right with blue text (Used in Settings)
UITableViewCellStyleValue2, // Right aligned label on left with blue text and left aligned label on right (Used in Phone/Contacts)
UITableViewCellStyleSubtitle // Left aligned label on top and left aligned label on bottom with gray text (Used in iPod).
区别:
Default:默认样式,只有主标题,没有副标题
Value1:左边主标题textLabel,右边副标题detailTextLabel,主标题字体比较黑
Value2:左边主标题textLabel字体偏小,主标题右边挨着一个副标题detailTextLabel,字体大且加黑
Subtitle:主标题textLabel在上,字体加大偏黑,副标题detailTextLabel在主标题下面字体偏小
- UITableViewCellSelectionStyle
个人觉得除了None,其他三个好像是一样的效果,都是灰色
//UITableViewCellSelectionStyleNone
//UITableViewCellSelectionStyleBlue
//UITableViewCellSelectionStyleGray
//UITableViewCellSelectionStyleDefault
cell.selectionStyle = UITableViewCellSelectionStyleNone;
自定义选中cell背景,注意自定义选中背景不能设置cell的selectionStyle属性为UITableViewCellSelectionStyleNone
//自定义选中cell的背景颜色
cell.selectedBackgroundView = [[UIView alloc] initWithFrame:cell.frame];
cell.selectedBackgroundView.backgroundColor = [UIColor redColor];
//自定义选中cell的背景图片
cell.selectedBackgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"picture"]];
- UITableViewCellAccessoryType
//UITableViewCellAccessoryNone
//UITableViewCellAccessoryDisclosureIndicator 箭头
//UITableViewCellAccessoryDetailDisclosureButton 圆圈感叹号加箭头
//UITableViewCellAccessoryCheckmark 一个勾
//UITableViewCellAccessoryDetailButton 圆圈感叹号
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
- 刷新某个区或某一行
//一个section刷新
NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:1]; //你需要更新的组数
[tableview reloadSections:indexSet withRowAnimation:UITableViewRowAnimationNone];
//一个cell刷新
NSIndexPath *indexPath=[NSIndexPath indexPathForRow:3 inSection:0]; //你需要更新的组数中的cell
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationNone];
---------- cocoapods ----------
pod install --verbose --no-repo-update
该命令只安装新添加的库,已更新的库忽略
pod update 库名 --verbose --no-repo-update
该命令只更新指定的库,其它库忽略
---------- 常用的一些宏定义 ----------
//控制台打印
#ifdef DEBUG
#define DLog(format, ...) printf("class: <%p %s:(%d) > method: %s \n%s\n", self, [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, __PRETTY_FUNCTION__, [[NSString stringWithFormat:(format), ##__VA_ARGS__] UTF8String] )
#else
#define DLog(format, ...)
#endif
//尺寸
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
#define kScreenHeight [UIScreen mainScreen].bounds.size.height
#define kPercenX_scale(value) (value *WIDTH/375)//按照iPhone 8尺寸比例——宽
#define kPercenY_scale(value) (value *HEIGHT/667)//按照iPhone 8尺寸比例——高
#define kTopHeight_SafeArea (SCRE_HEIGHT == 812.0 ? 88 : 64)//如果是iPhone X 顶部安全距离为88
#define kBottomHeight_SafeArea (SCRE_HEIGHT == 812.0 ? 34 : 0)//如果是iPhone X 底部安全距离为34
//颜色
#define UIColorFromRGB(r, g, b) [UIColor colorWithRed:(r)/255.0 \
green:(g)/255.0 blue:(b)/255.0 alpha:1.0]//RGB颜色
#define UIColorFromRGBA(r, g, b, a) [UIColor colorWithRed:(r)/255.0 \
green:(g)/255.0 blue:(b)/255.0 alpha:a]//RGBA颜色
#define UIColorFromHEX(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]//十六进制转RGB
#define UIColorFromHEXA(rgbValue, alphaValue) [UIColor \
colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \
green:((float)((rgbValue & 0x00FF00) >> 8))/255.0 \
blue:((float)(rgbValue & 0x0000FF))/255.0 alpha:alphaValue]//十六进制转RGBA
#define UIColorFromRandom [UIColor colorWithRed:(arc4random_uniform(256))/255.0 \
green:(arc4random_uniform(256))/255.0 \
blue:(arc4random_uniform(256))/255.0 alpha:1.0]//随机颜色
//弱引用
#define weakSelf __weak __typeof(&*self)weakSelf = self;
---------- 打电话 发短信 ----------
- 拨打电话
//1. openURL 弹提示框 通话结束返回当前页面
//NSString *str = @"telprompt://10010";私有API,因此可能通不过苹果官方审核
NSString *str = @"tel:10010";
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:str] options:@{} completionHandler:nil];
//2. UIWebView 弹提示框 通话结束返回当前页面(推荐使用)
NSString *str = @"tel:10010";
UIWebView *callWebView = [[UIWebView alloc] init];
NSURL *telURL = [NSURL URLWithString:str];
[callWebView loadRequest:[NSURLRequest requestWithURL:telURL]];
[self.view addSubview:callWebView];
- 发送短信
//1.直接跳转系统发短信页面,发完短信后不能自动回到原应用
NSString *str = @"sms://10010";
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:str] options:@{} completionHandler:nil];
//2.使用MessageUI 框架发送短信,可点击取消返回当前页面,发送完毕自动返回当前页面
#import
MFMessageComposeViewController *vc = [[MFMessageComposeViewController alloc]init];
vc.body = @"吃饭了没";//设置短信内容
vc.recipients = @[@"10010",@"10086"];//设置收件人列表
vc.messageComposeDelegate = self;//设置代理
[self presentViewController:vc animated:YES completion:nil];
#pragma mark - MFMessageComposeViewControllerDelegate
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
{
[controller dismissViewControllerAnimated:YES completion:nil];
}
---------- valueForKeyPath的使用----------
注:此段内容转载自http://www.cocoachina.com/ios/20180629/23983.html
- 获取数组中的最大值、最小值、平均值以及和值
CGFloat max = [[array valueForKeyPath:@"@max.floatValue"] floatValue];
CGFloat min = [[array valueForKeyPath:@"@min.floatValue"] floatValue];
CGFloat avg = [[array valueForKeyPath:@"@avg.floatValue"] floatValue];
CGFloat sum = [[array valueForKeyPath:@"@sum.floatValue"] floatValue];
- 获取数组中相同key的元素
NSArray *arr = @[@{@"city":@"beijing",@"person":@{@"name":@"zhangsan"}},@{@"city":@"chengdu"}];
[arr valueForKeyPath:@"city"];
//可以获取到city数组 @[@"beijing",@"chengdu"]
//
- 可以使用. 来一层一层向下索引
NSDictionary *dict1 = @{@"dic1":@{@"dic2":@{@"name":@"lisi",@"info":@{@"age":@"12"}}}};
id res = [dict1 valueForKeyPath:@"[dict1.dict2.name];
- 删除重复的数据
NSArray *array = @[@"qq", @"wechat", @"qq", @"msn", @"wechat"];
[array valueForKeyPath:@"@distinctUnionOfObjects.self"];
- 嵌套使用(先删除对应值的重复数据再取值)
NSArray *array = @[@{@"name" : @"xiaoming",
@"code" : @1},
@{@"name": @"judy",
@"code" : @2},
@{@"name": @"judy",
@"code" : @3},
@{@"name": @"xiaohua",
@"code" : @4}];
[array valueForKeyPath:@"@distinctUnionOfObjects.name"];
- 改变 UITextfield 的 placeholder 的颜色
[addressTextField setValue:[UIColor redColor] forKeyPath:@”_placeholderLabel.textColor”];
//比起重写 - (void)drawPlaceholderInRect:(CGRect)rect; 要方便太多!
---------- 其他一些冷知识 ----------
- 有些系统的东西 显示的是英文,只要将plist中的:Localization native development region 的en修改成Zn即可
- 修改状态栏颜色
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
- UIAlertController 修改字体颜色
//修改所有按钮的颜色
alertController.view.tintColor = [UIColor blackColor];
//修改单个按钮的颜色
[cancleAction setValue:[UIColor grayColor] forKey:@"_titleTextColor"];
- label动态获取高度,text为label的文字,width为label的宽度
CGFloat labelHeight = [text boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:16]} context:nil].size.height;
- label属性字符串改变颜色
NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:title];
[attributedStr addAttribute:NSForegroundColorAttributeName value:COLOR range:NSMakeRange(0, 4)];
- 根据当前view获取所在的controller
- (UIViewController *)viewControllerSupportView:(UIView *)view {
for (UIView* next = [view superview]; next; next = next.superview) {
UIResponder *nextResponder = [next nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]]) {
return (UIViewController *)nextResponder;
}
}
return nil;
}
- 获取当前viewController的引用计数
NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)self));
未完待续...