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


目录
相关文章
|
3月前
|
Python
京东技术团队撰写的整整986页《漫画学Python》到底有什么魅力?
这是一本Python入门书。无论您是想学习编程的小学生,还是想参加计算机竞赛的中学生,抑或是计算机相关专业的大学生,甚至是正在从事软件开发的职场人,本书都适合您阅读和学习。但您若想更深入地学习Python并进行深层次应用,则需要选择其他相关图书。
|
网络协议 架构师 数据中心
GitHub已标星93K!网易首席架构师闭关3月撰写1200页网络协议笔记
网络协议介绍 网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
|
存储 C++
【PAT甲级 - C++题解】1076 Forwards on Weibo
【PAT甲级 - C++题解】1076 Forwards on Weibo
57 0
|
存储 C++
【PAT甲级 - C++题解】1124 Raffle for Weibo Followers
【PAT甲级 - C++题解】1124 Raffle for Weibo Followers
66 0
|
JSON 前端开发 安全
《提效神器 Design Token 的探索与应用 - 昱星 & 元尧》演讲视频 + 文字版
《提效神器 Design Token 的探索与应用 - 昱星 & 元尧》演讲视频 + 文字版
292 0
|
区块链 数据格式 JSON
阿凡达Avatar泰山众筹开发说明,阿凡达Avatar泰山众筹系统开发技术分析,阿凡达Avatar泰山众筹源码稳定版
# 通过合约.功能.调用接口方法(传参数).获取返回值 # contract.functions.接口方法名(参数1,参数2,参数3).call() res = contract.functions.getLastMintInfo(10).call() print("getLastMintInfo:", res)
|
区块链 容器 Docker
泰山众筹4.0阿凡达Avatar系统开发技术详细丨泰山众筹4.0阿凡达Avatar系统源码
pragma solidity ^0.4.21; contract TransactionFee { // (1) uint public fee;
WeiBo开发经历(下)
WeiBo开发经历(下)
173 0
WeiBo开发经历(下)
|
Web App开发 Rust 前端开发
前端周刊第十九期
前端周刊发表每周前端技术相关的大事件、文章教程、一些框架的版本更新、以及代码和工具。每周定期发表,欢迎大家关注、转载。
前端周刊第十九期
|
安全 数据安全/隐私保护
最新最全QQ独门使用秘诀
  1、减少qq占用内存资源的秘笈   登陆qq后,占用内存:约8m   qq离线,占用内存:约10m   秘笈:登陆qq后,随便打开一个好友的对话窗口,把它最小化,qq占用的内存就变为3m了,这对于内存小的朋友特别有用!!   2、qq自定义头像上传成功率较高的方法
145 0