技术点12:有关颜色的问题(讲解)
- 颜色的分类:每一种像素都有自己的颜色,每一种颜色都可以由RGB3色组成,十六进制由4个二进制组成
- (1)12bit颜色:#f00(代表红) #0f0 #ff0 3*4 十六进制(每一个一组)
- (2)24bit颜色:#ff0000 #ffff00 #000000 #ffffff 3*8 十六进制(每两个一组)
- (3)32bit颜色(RGB):(下面是一个红) 4*8 最后另个数字是透明度
指定的RGB颜色
#define CWColor(r,g,b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0];
//随机色(配合上面的的使用) #define CWRandomColor CWColor(arc4random_uniform(256),arc4random_uniform(256),arc4random_uniform(256))
技术点13.自定义NSLog
- 分析:在开发项目时,我们常常喜欢测试,会设置很多的NSLog,问题来了,在项目结束的时候会有很多的NSLog,如何一个一个的去关闭太麻烦,如果不关闭大家知道打印是很消耗性能的,下面我们就自定义NSLog.
- 解决问题:我们在开发程序的过程中都是处在Debug模式,而在项目上线之后处在Release模式
在Pch文件里面写上
#ifdef DEBUG //处于开发阶段 #define CWLog(...) NSLog(__VA_ARGS__) #else //处于发布阶段(没有输出 #define CWLog(...) #endif
技术14.如何在导航栏上设置一个搜索框??哪种方法最好???
- 最终效果图
能够拥有输入框的目前为止我们经常用的有UITextField和UISearchBar以及UITextView三种
解释:(只要是继承于UIControl)
1.UITextFiled是在此比较好的输出入框,因为它是小文本输入,设置多样化,很多的属性
2.UISearchBar也很好,属性较少,限制太多,无法把🔍放到左边,总之它也很好,主要是搜索框
3.UItextView是大文本的输入,不适合搜索
选择第一种的代码:(imageVIew一定要设置frame,图片一定要放到左边且contentMode图片居中)
UITextField *searchBar = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 300, 30)]; searchBar.backgroundColor = [UIColor grayColor]; //搜索框字体的大小以及搜索的提示语 searchBar.font = [UIFont systemFontOfSize:15]; searchBar.placeholder = @"请输入搜索条件"; UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 30, 30)]; //图片靠左又居中**(imageView没有发生变化变化的是image的大小)** imageView.contentMode = UIViewContentModeCenter; imageView.image = [UIImage imageNamed:@"searchbar_second_textfield_search_icon"]; searchBar.leftView = imageView; //始终放到左边 searchBar.leftViewMode = UITextFieldViewModeAlways; 边框的模式 searchBar.borderStyle = UITextBorderStyleRoundedRect; [searchBar addTarget:self action:@selector(change) forControlEvents:UIControlEventEditingChanged]; //设置为导航栏的titleView self.navigationItem.titleView = searchBar;
技术15.设置一张图片有没有尺寸的两种方式(imageView)
第一种方式:通过initWithImage来创建初始化UIImage,UIImageView的尺寸就等于image的尺寸 UIImage *image = [UIImage imageNamed:@"图片的名字"]; UIImageView *imageView = [[UIImageView alloc]initWithImage:image]; 第二种方式:通过init来创建绝大部分控件,控件都是没有尺寸 UIImageView *imageview = [[UIImageView alloc]init];//建议在此设置CGRectmake() imageview.image = [UIImage imageNamed:@"图片的名字"];
技术16.怎么设置微博首页的点击下拉菜单??如下
- 解决办法
分析:能点击说明是button(也可以添加手势)
下面以button为例:
-(void)setNavigationTitle { //中间的标题按钮 button = [[UIButton alloc]init];//等于 UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame =CGRectMake(0, 0, 150, 35); //设置图片和文字 [button setTitle:@"首页" forState:UIControlStateNormal]; [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; button.titleLabel.font = [UIFont boldSystemFontOfSize:22]; [button setTitleEdgeInsets:UIEdgeInsetsMake(0, 0, 0, 60)]; [button setImage:[UIImage imageNamed:@"navigationbar_arrow_down"] forState:UIControlStateNormal]; [button setImageEdgeInsets:UIEdgeInsetsMake(0, 90, 0, 0)]; //监听下拉菜单 [button addTarget:self action:@selector(clickTitle) forControlEvents:UIControlEventTouchUpInside]; self.navigationItem.titleView = button; } -(void)clickTitle { //如果图片的某个方向不规则,比如有突起,那么这个方向就不能拉伸 UIImageView *dropdownMenu = [[UIImageView alloc]init]; dropdownMenu.image = [UIImage imageNamed:@"popover_background"]; dropdownMenu.frame = CGRectMake(80, 50, 200, 300); //[self.view.window addSubview:dropdownMenu];//self.view.window = [UIApplication sharedApplication].keyWindow; [[UIApplication sharedApplication].keyWindow addSubview:dropdownMenu];
}
- 获取窗体window的方式(用window是为了防止点击首页跳出框被tabView的影响)
self.view.window = [UIApplication sharedApplication].keyWindow;
- 在此强烈推荐使用后者,因为后者永远有值,而前者不靠谱
- 获得window的方式:
UIWindow *window = [UIApplication sharedApplication].keyWindow; - 此做法可能会被键盘影响
技术点17.如何让一个视图或者其他东西永远处在视图的最上面,不被其他视图影响??
- 分析:首先要了解一个程序可以创建无数个window,如何获取当前最上面的window,方法如下:(技术16中的两种方式均不太靠谱)
获取window的三种方式(最后一种最靠谱)
UIWindow *window = self.view.window ;
UIWindow *window = [UIApplication sharedApplication].keyWindow;
UIWindow *window = [[UIApplication sharedApplication].windows lastObject];
效果:可以保持我们所期望的在最上面,也可以避免键盘的影响
技术点18.如何让出了跳出来的框框之外其他的地方都不可点击???
- 分析:这是一个tabView,导航栏还有两个按钮,他们都可以被动,怎么避免弹出小窗口而其他地方不可点击或者不可动
- 解决办法:加一层“蒙版”,没有那么神秘,就是一个view,frame等于窗体bounds,颜色clean,把小窗口和其他视图隔开
- 处理代码:(点击首页,先显示蒙板,再显示小窗口,这样,小窗口里面的东西才可以点击)
//获取到最后面的window UIWindow *window = [[UIApplication sharedApplication].windows lastObject]; window.backgroundColor = [UIColor brownColor]; UIView *cover = [[UIView alloc]init]; cover.frame = window.bounds; [window addSubview:cover]; //如果图片的某个方向不规则,比如有突起,那么这个方向就不能拉伸 UIImageView *dropdownMenu = [[UIImageView alloc]init]; dropdownMenu.image = [UIImage imageNamed:@"popover_background"]; dropdownMenu.frame = CGRectMake(80, 50, 200, 300); //[self.view.window addSubview:dropdownMenu];//self.view.window = [UIApplication sharedApplication].keyWindow; [cover addSubview:dropdownMenu];
- 只需要把颜色设置为clean就好了,就能获得上面的图形,二其他地方就不能点击了
window.backgroundColor = [UIColor clearColor];
- 特别说明:想在框框dropdownMenu添加东西只需要 addSubview,还需要注意的是dropdownMenu(UIIMageView的对象)不可交互
技术19.如何封装一个菜单栏???(像上面的一样,点击首页跳出)
- 分析:把菜单栏放在蒙板上,封装蒙板就好了,蒙板继承于UIView
- 解决办法:建一个CWDropDownMenu类继承与UIView进行封装
具体的我会把封装放到github
技术20.如何获取一个视图的最大y值或者x值???
解决办法:
CGRectGetMaxX(view.frame) 获取视图的最大x值 CGRectGetMaxY(view.frame) 获取视图的最大y值
技术20.如何转换坐标???(针对是view)(下面的如果toView:nil)nil代表window
分析:明确一个东西frame,一个控件的frame是相对于父视图来说的
- 思路:在默认的情况下,frame是以父控件左上角为坐标原点,bounds是以自身的(0,0)为坐标原点的
- 下面是三个视图的坐标代码(普通控制器上面写的代码)
//1.blue self.blue = [[UIView alloc]initWithFrame:CGRectMake(0, 50, 300, 300)]; self.blue.backgroundColor = [UIColor blueColor]; [self.view addSubview:self.blue]; //2.red self.red = [[UIView alloc]initWithFrame:CGRectMake(100, 150, 100, 100)]; self.red.backgroundColor = [UIColor redColor]; [self.blue addSubview:self.red]; //3.yellow self.yellow = [[UIView alloc]initWithFrame:CGRectMake(20, 30, 50, 50)]; self.yellow.backgroundColor = [UIColor yellowColor]; [self.red addSubview:self.yellow];
- 现在我们改变黄色视图的坐标(两种方法一样)
- 只需要记住:1.这是在计算yellow这个控件在相对于red上面的位置和尺寸
CGRect newRect1 = [self.yellow convertRect:self.yellow.bounds toView:self.red];
CGRect newRect2 = [self.yellow.superview convertRect:self.yellow.frame toView:self.red];
- 下面是输出:
NSLog(@"%@",NSStringFromCGRect(newRect1)); NSLog(@"%@",NSStringFromCGRect(newRect2)); 相对于自身的输出 NSLog(@"%@",NSStringFromCGRect(self.yellow.bounds)); 相对于父视图的输出 NSLog(@"%@",NSStringFromCGRect(self.yellow.frame));
- 2.这是在计算magenta相对于button1的位置坐标和尺寸(输出的表示和上面的一样)
CGRect rectNew1 = [self.button1 convertRect:self.magenta.bounds fromView:self.magenta];
技术点21.当我们点击某一个button的时候跳出来一个提示框并且提示框下面还有一个盖板,此时如何消除我们的提示框???
分析:此时我们发现点击任何地方都没有反应,不过有一个触屏方法touch我们没有用
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self dismiss]; } -(void)dismiss { [self removeFromSuperview]; }
解决办法:
1.点击提示框以外会调用touch,我们调用移除dismiss即可
2.给盖板view添加手势,让其点击消失调用dismiss
- 重点:touchesBegan 这个方法只针对最底层的view来用,而不是其他的视图的touches
技术22.如何设置微博下面的加号???给大家封装好了
- 分析:加号到底是什么?如何设置??以及点击加号之后又会发生什么???
解决办法:
不能把加号设置成一个控制器原因:浪费对象,加号的位置不好布局
具体的布局以及用法请下载我的封装
技术23.如何让时间在一个界面一直显示而且不断地更新???
- 分析:时间一直更新的话需要不断地刷新这个界面的时间设定,我们可以进入这个界面就设置定时器,不断地去刷新这个时间设定(可以设定指定的时间做某些事情)
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTime) userInfo:nil repeats:YES]; label = [[UILabel alloc]initWithFrame:CGRectMake(20, 200, 300, 50)]//声明全局 label.backgroundColor = [UIColor whiteColor]; [self.view addSubview:label]; -(void)updateTime { NSDate *date = [NSDate dateWithTimeIntervalSinceNow:10*60]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; [dateFormatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"]; label.text = [dateFormatter stringFromDate:date]; if ([label.text isEqual: @"2016年06月09日 02:41:00"]) { //在此可以设定指定的时间做某些事情 } }