平时有很多不常用的细节小代码的处理,都是不怎么常用的,但是一旦要到了使用的时候有很多时候会想不起来,在这里统一回记录下小细节的代码处理,防止自己忘记到处去查找,不定时更新
1.设置按钮文字左对齐
// button.titleLabel.textAlignment = NSTextAlignmentLeft; 这句无效
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
button.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
这里使用
button.titleLabel.textAlignment = NSTextAlignmentLeft; 这行代码是没有效果的,这只是让标签中的文本左对齐,但并没有改变标签在按钮中的对齐方式。
所以,我们首先要使用
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; 这行代码,把按钮的内容(控件)的对齐方式修改为水平左对齐,但是这们会紧紧靠着左边,不好看,所以我们还可以修改属性:
button.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
这行代码可以让按钮的内容(控件)距离左边10个像素,这样就好看多了,当然也可以不修改。
2.切图片圆角
imageView.layer.cornerRadius = 5;
imageView.layer.masksToBounds = YES;
3.关闭键盘的输入预测
textField.autocorrectionType = UITextAutocorrectionTypeNo;
textView.autocorrectionType = UITextAutocorrectionTypeNo;
4.自定义视图,可以实时的观看界面
这个是一个小的功能,平常在自定义视图的时候,会需要调整很多东西,如果每次修改一个东西就运行一下的话,实在太麻烦,因此可以实时的观看界面就会有很好的体验:
1.首先需要创建自定义视图的这个类,继承与UIVIew
2.其次创建一个xib的文件,名字随便你启,因为以后用完会删除的
3.将这个xib文件和这个类进行关联
4.添加 IB_DESIGNABLE 在上方,swift是拥有一个 IB_DESIGNABLE 的属性,
5.在.m文件中的- (void)drawRect:(CGRect)rect ;方法中添加各种控件视图之类的。
6.打开分页按钮,就可以愉快的玩耍了
代码如下:
#import <UIKit/UIKit.h>
IB_DESIGNABLE
@interface LKPPassWordView : UIView
@end
/********************************************************/
#import "LKPPassWordView.h"
@implementation LKPPassWordView
- (void)drawRect:(CGRect)rect {
// Drawing code
UIView *view2 = [[UIView alloc]initWithFrame:CGRectMake(20, 20, 50, 50)];
view2.backgroundColor = [UIColor magentaColor];
[self addSubview:view2];
UIView *view3 = [[UIView alloc]initWithFrame:CGRectMake(150, 20, 50, 50)];
view3.backgroundColor = [UIColor yellowColor];
view3.layer.cornerRadius = 25;
view3.layer.masksToBounds = YES;
[self addSubview:view3];
}
@end
5.经常用到的搜索按钮中,开始搜索的时候出现取消按钮,并且修改取消按钮的文字颜色和背景色
#pragma mark 搜索开始编辑
//设置取消按钮一定要在这个方法中设置,不然会崩溃
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
//设置取消按钮样式
//首先取出cancelBtn,这里利用KVC来取出Btn
UIButton *cancelBtn = [searchBar valueForKey:@"cancelButton"];
//取消按钮文字
[cancelBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, 3, 0, 3)];
[cancelBtn setTitle:@"取消" forState:UIControlStateNormal];
[cancelBtn.titleLabel setFont:[UIFont systemFontOfSize:14]];
//取消按钮文字颜色
[cancelBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[cancelBtn setBackgroundColor:[UIColor colorWithRed:19/255.0 green:123/255.0 blue:191/255.0 alpha:1]];
//设置圆角
cancelBtn.layer.cornerRadius = 3;
cancelBtn.layer.masksToBounds = YES;
//代理回调
if ([_shSeatchBarDelegate respondsToSelector:@selector(searchBarTextDidBeginEditing:)]) {
[_shSeatchBarDelegate searchBarTextDidBeginEditing:self];
}
}
#pragma mark 编辑
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
//显示取消按钮
[searchBar setShowsCancelButton:YES animated:YES];
return YES;
}
#pragma mark 编辑
- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {
return YES;
}
6.版本号的获取
iOS的版本号,一个叫做Version,一个叫做Build,这两个值都可以在Xcode 中选中target,点击“Summary”后看到。 Version在plist文件中的key是“CFBundleShortVersionString”,和AppStore上的版本号保持一致,Build在plist中的key是“CFBundleVersion”,代表build的版本号,该值每次build之后都应该增加1。这两个值都可以在程序中通过下面的代码获得:
//获取应用的Verison号
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]
//或者下面这个
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
//获取应用的build号
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]
7、判断两个字典是否完全相同
//YES标明两个字典中每个值都相等,NO表示两个字典中至少有一个元素不等
[[demandTempDict allKeys] isEqual:[self.demandDetailDic allKeys]]
8、判断APP是不是第一次启动
//判断是不是第一次启动应用
if(![[NSUserDefaults standardUserDefaults] boolForKey:@"firstLaunch"])
{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"firstLaunch"];
NSLog(@"第一次启动");
//如果是第一次启动的话,使用UserGuideViewController (用户引导页面) 作为根视图
BLUserGuideViewController *userGuideViewController = [[BLUserGuideViewController alloc] init];
self.window.rootViewController = userGuideViewController;
}
else
{
NSLog(@"不是第一次启动");
[self showScreenLockView];
}
9、修改tableView的头部视图,尾部视图
#pragma mark 改变头部视图
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
view.tintColor = ControllerColor;
UITableViewHeaderFooterView *head = (UITableViewHeaderFooterView *)view;
head.textLabel.textColor = RGB(62, 99, 114, 1);
head.textLabel.font = HeadFont;
}
关于修改头部视图的方法中,上面这个方法确实可以达到修改头部视图的目的,但是却是对头部视图中自己包含的控制进行一些修改,无法达到自定义的目的,比如给头部视图或者尾部视图添加点击事件,或者在头部视图或者尾部视图上面添加一些其他的控件之类的,都是无法达到其中的目的的,所以可以对头部视图或者尾部视图进行自定义:
#pragma mark 修改尾部视图,点击点击事件
//这个方法在修改尾部视图中的时候,可以直接返回button或者自定义好的视图
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
NSArray *sectionArr = self.filterDataArray[section];
if (sectionArr.count > 3) {//拥有更多的信息
SearchBaseModel *model = sectionArr[0];
UIView *view = [self tableViewSectionFooterView:model.modelType];
return view;
}else{//最多只有三个选项
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, SHWidth, 5)];
view.backgroundColor = [UIColor yellowColor];
return view;
}
}
#pragma mark - 组的尾部按钮
- (UIView *)tableViewSectionFooterView:(ResultModelType)modelType{
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, SHWidth, 50)];
view.backgroundColor = [UIColor clearColor];
UIButton *sectionFooterBtn = [UIButton buttonWithType:UIButtonTypeCustom];
sectionFooterBtn.backgroundColor = [UIColor whiteColor];
[sectionFooterBtn setFrame:CGRectMake(0, 0, SHWidth, 40)];
[sectionFooterBtn addTarget:self action:@selector(sectionFooterBtnClick:) forControlEvents:UIControlEventTouchUpInside];
sectionFooterBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
sectionFooterBtn.titleEdgeInsets = UIEdgeInsetsMake(0, 15, 0, 0);
sectionFooterBtn.titleLabel.font = [UIFont systemFontOfSize:16];
[sectionFooterBtn setTitleColor:RGB(45, 112, 219, 1.0) forState:UIControlStateNormal];
sectionFooterBtn.tag = modelType;
//添加tag值标示
if (modelType == ResultModelType_Address) {
[sectionFooterBtn setTitle:@"查看更多联系人" forState:UIControlStateNormal];
}else if (modelType == ResultModelType_GroupChat){
[sectionFooterBtn setTitle:@"查看更多群聊" forState:UIControlStateNormal];
}else if (modelType == ResultModelType_PubilcAccounts){
[sectionFooterBtn setTitle:@"查看更多订阅号" forState:UIControlStateNormal];
}
[view addSubview:sectionFooterBtn];
return view;
}
10、给UITextField添加文字内容改变的检测方法
[_topView addTarget:self action:@selector(textFiledChange:) forControlEvents:UIControlEventEditingChanged];
#pragma mark 输入框文字改变
- (void)textFiledChange:(UITextField *)sender{
//防止系统键盘中的中文出现预搜索
if (sender.markedTextRange == nil) {
//搜索内容的实现
}
}
11.纯代码创建UI界面入口即window界面
1.在工程的编辑配置界面找到general->Deployment info->Main Interface将里面的主界面的配置信息给删除
2.然后在appdelegate中上代码
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
ViewController *mainView = [[ViewController alloc]init];
self.window.rootViewController = mainView;
12.关于打印的时候有值,但是用鼠标查看的时候没有值得问题
有的时候在写代码的时候,定义的一些变量明明是有值得,用log打印的时候也是可以显示出里面的值,但是当自己用鼠标放在该变量的时候,或者去打印日志信息的左边去查看的时候,就会显示出nil的问题。主要是因为xcode的build configuration的设置错误的问题,将其设置成debug模式就可以了
13.关于tag值的使用
一般在搭建界面的时候,比较习惯于在一些按钮中直接标明tag值的,这样的话可以将点击方法都放在一起,点击的时候通过区分不同的tag值来达到区分点击了不同的按钮,这样在代码维护的时候也方便!还有一种用法就是,自己界面可以直接访问到自己界面的按钮,这样就不用来定义和声明多个控件了
//手机号码
UITextField *telField = (UITextField *)[self.view viewWithTag:20];
//这个是直接获取到界面上面的输入框,这样就不需要再定义了,同时可以拿到数据
14.关于设置搜索框外层的颜色之后,搜索框边框黑线问题
在使用系统的SearchBar之后,如果修改了搜索框外层的颜色之后,在点击以及使用搜索框的时候会在上下两边出现一条黑线的问题,这里是修改黑线的颜色:
UIImageView *barImageView = [[[self.searchBar.subviews firstObject] subviews] firstObject];
barImageView.layer.borderColor = RGB(248,248,248,1.0).CGColor;
barImageView.layer.borderWidth = 1;
15.设置tableview的下划线距离以及下划线颜色
//设置下划线
self.tableView.separatorInset = UIEdgeInsetsMake(0, 15, 0, 0);
self.tableView.separatorColor = RGB(231, 231, 231, 1.0);
16.让nav全部透明化,效果如下图所以
这个效果所示是将nav全部透明化,将地下的图片可以穿透上来,有两种方法
- (void)viewWillAppear:(BOOL)animated{
[self.navigationController.navigationBar setTintColor:[UIColor whiteColor]];
[self.navigationController.navigationBar setTranslucent:true];
//设置导航栏背景图片为一个空的image,这样就透明了
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
//去掉透明后导航栏下边的黑边
[self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];
}
17.iOS14.6 系统下,加载pdf会导致内存暴涨。
在14.6的手机上复现了问题。
通过断点和抓包,Xcode控制台报错:
“Received memory pressure event 16 vm pressure 0”
内存暴涨导致APP闪退。
发现列表里有一个客户的头像返回地址是个pdf,这个信息比较反常。
经过尝试,UIImageView 在 iOS14.6 系统下,加载pdf会导致内存暴涨。
解决:对头像地址的 pdf 格式进行过滤。发新包升级。