WeiBo开发经历(中)

简介: WeiBo开发经历(中)

技术点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模式


image.png

Pch文件里面写上

#ifdef DEBUG //处于开发阶段
   #define CWLog(...) NSLog(__VA_ARGS__)
   #else //处于发布阶段(没有输出
   #define CWLog(...)
   #endif


image.png


技术14.如何在导航栏上设置一个搜索框??哪种方法最好???


  • 最终效果图


image.png


能够拥有输入框的目前为止我们经常用的有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)


image.png


第一种方式:通过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.怎么设置微博首页的点击下拉菜单??如下


image.png



  • 解决办法
    分析:能点击说明是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.如何让出了跳出来的框框之外其他的地方都不可点击???


image.png

  • 分析:这是一个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];


image.png


image.png


  • 只需要把颜色设置为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值


image.png


技术20.如何转换坐标???(针对是view)(下面的如果toView:nil)nil代表window


分析:明确一个东西frame,一个控件的frame是相对于父视图来说的


image.png


  • 思路:在默认的情况下,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.如何设置微博下面的加号???给大家封装好了

image.png

  • 分析:加号到底是什么?如何设置??以及点击加号之后又会发生什么???
    解决办法:
    不能把加号设置成一个控制器原因:浪费对象,加号的位置不好布局
    具体的布局以及用法请下载我的封装


技术23.如何让时间在一个界面一直显示而且不断地更新???


image.png


  • 分析:时间一直更新的话需要不断地刷新这个界面的时间设定,我们可以进入这个界面就设置定时器,不断地去刷新这个时间设定(可以设定指定的时间做某些事情)

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"]) {
    //在此可以设定指定的时间做某些事情
  }
}


目录
相关文章
|
5月前
|
前端开发 搜索推荐 开发者
当title遇上alt:Web前端中的秘密较量,谁才是真正的赢家?
【8月更文挑战第26天】在Web开发中,`title`和`alt`属性对于提升网站的可访问性和搜索引擎优化至关重要。`title`属性可在鼠标悬停时显示额外信息,增强用户体验;`alt`属性主要用于图像,提供替代文本以确保视觉障碍用户及搜索引擎能理解图像内容。正确使用这两个属性可以显著提高网站的友好性和可达性。
48 1
|
前端开发 JavaScript
#yyds干货盘点# 前端歌谣的刷题之路-第一百七十题-bind
#yyds干货盘点# 前端歌谣的刷题之路-第一百七十题-bind
86 0
#yyds干货盘点# 前端歌谣的刷题之路-第一百七十题-bind
|
前端开发
#yyds干货盘点# 歌谣学前端之类笔记1
#yyds干货盘点# 歌谣学前端之类笔记1
78 0
|
前端开发
#yyds干货盘点# 歌谣学前端之展开..
#yyds干货盘点# 歌谣学前端之展开..
83 0
|
前端开发
#yyds干货盘点# 歌谣学前端之展开...
#yyds干货盘点# 歌谣学前端之展开...
60 0
|
前端开发 JavaScript
#yyds干货盘点# 前端歌谣的刷题之路-第一百零七题-接口
#yyds干货盘点# 前端歌谣的刷题之路-第一百零七题-接口
105 0
#yyds干货盘点# 前端歌谣的刷题之路-第一百零七题-接口
|
存储 前端开发 JavaScript
#yyds干货盘点# 前端歌谣的刷题之路-第一百零八题-切换tab栏目
#yyds干货盘点# 前端歌谣的刷题之路-第一百零八题-切换tab栏目
95 0
#yyds干货盘点# 前端歌谣的刷题之路-第一百零八题-切换tab栏目
|
前端开发
#yyds干货盘点# 前端歌谣的刷题之路-第七十二题- url地址
#yyds干货盘点# 前端歌谣的刷题之路-第七十二题- url地址
119 0
#yyds干货盘点# 前端歌谣的刷题之路-第七十二题- url地址
|
前端开发
#yyds干货盘点# 前端歌谣的刷题之路-第七十八题-单向绑定
#yyds干货盘点# 前端歌谣的刷题之路-第七十八题-单向绑定
111 0
#yyds干货盘点# 前端歌谣的刷题之路-第七十八题-单向绑定
|
前端开发
#yyds干货盘点# 前端歌谣的刷题之路-第八十八题-参数解析器
#yyds干货盘点# 前端歌谣的刷题之路-第八十八题-参数解析器
99 0
#yyds干货盘点# 前端歌谣的刷题之路-第八十八题-参数解析器