WeiBo开发经历

0##技术点1:下面图片被选中的图片应该是棕橙色,为什么是蓝色??怎么做??
UIViewController *vc1 = [[UIViewController alloc]init];
//自己设置的一个随机色
vc1.view.backgroundColor = CWRandomColor;
vc1.tabBarItem.title = @"首页";
vc1.tabBarItem.image = [UIImage imageNamed:@"tabbar_home"];
vc1.tabBarItem.selectedImage = [UIImage imageNamed:@"tabbar_home_selected"];

未选中tabbar_home

选中tabbar_home_selected
选中普通图片后的显示
  • 解决办法:以第一个首页为例,
    1.tabBarItem有这样一个情况:如果你把一个普通的图片给selectedImage,在选中的时候自动渲染成蓝色,下面咱们就需要阻止它渲染
    2.主要采用一个方法,不让它进行渲染(下面的图片返回值为一张图片直接给选中之后就好了)

  • (UIImage*)imageWithRenderingMode:(UIImageRenderingMode)renderingMode NS_AVAILABLE_IOS(7_0);

    UIViewController *vc1 = [[UIViewController alloc]init];
    //自己设置的一个随机色
    vc1.view.backgroundColor = CWRandomColor;
    vc1.tabBarItem.title = @"首页";
    vc1.tabBarItem.image = [UIImage imageNamed:@"tabbar_home"];
     //声明这张图片按照原始的样子显示出来,不要自动渲染成其他颜色(比如蓝色)
     vc1.tabBarItem.selectedImage = [[UIImage imageNamed:@"tabbar_home_selected"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];//原始的,原来的样子
    
改变之后的显示
  • 感悟:遇到问题可以到官方文档进行搜,还可以进行一些网站进行搜索,下面提供一些方法

(1)官方搜索答案,比如这里的搜索UIImage看看有没有新的功能,你会有不少的收获。(2)百度搜索。(3)外国网站:stackoverflow(需要翻墙进入),这个是一个专业的IT网站(十个问题八个在这里都可以被解决掉)。特点是:全英文,由此可见学好英文很重要。

技术点2:如何改变上面字体的颜色呢??

解决办法:系统的方法:要的式字典

-(void)setTitleTextAttributes:(nullable NSDictionary<NSString*,id>*)attributes forState:(UIControlState)state NS_AVAILABLE_IOS(5_0) UI_APPEARANCE_SELECTOR;

改变字体的样式(两种,选中和没有选中)

NSMutableDictionary *textAttrs = [NSMutableDictionary dictionary];
textAttrs[NSForegroundColorAttributeName] = [UIColor blackColor];关键步骤
[vc1.tabBarItem setTitleTextAttributes:textAttrs forState:UIControlStateNormal];

NSMutableDictionary *selectedtextAttrs = [NSMutableDictionary dictionary];
selectedtextAttrs[NSForegroundColorAttributeName] = [UIColor orangeColor];
[vc1.tabBarItem setTitleTextAttributes:selectedtextAttrs  forState:UIControlStateSelected];
改变字体颜色的效果图

技术点3 微博分栏里面的灰色不是我想要的,我要改变未选中状态的颜色怎么办???

解决办法:采用取色计来取色,苹果电脑spotlight搜索color,双击即可,鼠标点在哪里哪里的RGB就会显示出来

取色计
取色计的显示

技术点4:遇到很多的相同代码怎么办???

解决办法:
很多重复的代码->将重复的代码抽取到一个方法中
1.相同的代码放到一个方法中
2.不同的东西变成参数
3.在使用这段代码的地方调用

下面展示代码的优化:(调用方法来减少相同的代码,提高传参的高效性)

 //RGB颜色(255后面一定要有“.0”,切记)
 #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))

设置子控制器(4个子控制器)(添加导航控制器只需要在下面方法里面添加导航控制器,让传进来的控制器作为其根控制器,把导航控制器的对象添加到tabBar里面)最后就是这样一个模块

框架的搭建
 CWHomeTableViewConreoller *homeVc = [[CWHomeTableViewConreoller alloc]init];

 [self addChildVc:homeVc Title:@"首页" image:@"tabbar_home" selectedImage:@"tabbar_home_selected"];

 CWMessageTableViewController *messageVc = [[CWMessageTableViewController alloc]init];

 [self addChildVc:messageVc Title:@"消息" image:@"tabbar_message_center" selectedImage:@"tabbar_message_center_selected"];

 CWDiscoverTableViewController *discverVc = [[CWDiscoverTableViewController alloc]init];

 [self addChildVc:discverVc Title:@"发现" image:@"tabbar_discover" selectedImage:@"tabbar_discover_selected"];

 CWProfileTableViewController *profileVc =[[CWProfileTableViewController alloc]init];

 [self addChildVc:profileVc Title: @"我" image:@"tabbar_profile" selectedImage:@"tabbar_profile_selected"];


  -(void)addChildVc:(UIViewController *)childVc Title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage
{

    //自己设置的一个随机色
    childVc.view.backgroundColor = CWRandomColor;

    childVc.tabBarItem.title = title;

    childVc.tabBarItem.image = [UIImage imageNamed:image];

    //声明这张图片按照原始的样子显示出来,不要自动渲染成其他颜色(比如蓝色)
    childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImage]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];//原始的,原来的样子

    //改变字体的样式(两种,选中和没有选中)
    NSMutableDictionary *textAttrs = [NSMutableDictionary dictionary];
    textAttrs[NSForegroundColorAttributeName] = CWColor(123, 123, 123);
    [childVc.tabBarItem setTitleTextAttributes:textAttrs forState:UIControlStateNormal];

    NSMutableDictionary *selectedtextAttrs = [NSMutableDictionary dictionary];
    selectedtextAttrs[NSForegroundColorAttributeName] = [UIColor orangeColor];
    [childVc.tabBarItem setTitleTextAttributes:selectedtextAttrs  forState:UIControlStateSelected];

}
简化更好

技术点5:怎么让跳转页面tabBar隐藏???重点来了:怎么让下一个控制器的tabBar隐藏,而不影响上一个控制器的tabBar(强烈推荐使用第一种)

  • 解决办法:讲3种(后两种效果不好会影响前后的界面的tabBar隐藏与否)
    第一种:(把下面代码放到跳转页面):hidesBottomBarWhenPushed

    CWTestViewController *testViewController = [[CWTestViewController alloc]init];//下一个控制器的实例化

    >//当testViewController控制器被push的时候,testViewController所在的tabBarController的tabbar会自动隐藏
    
//当testViewController控制器被pop的时候,testViewController所在tabBarController的tabBar就会自动显示

 >    testViewController.hidesBottomBarWhenPushed = YES;

     [self.navigationController pushViewController:testViewController animated:YES];

第二种:(把下面代码放到跳转页面)
     self.tabBarController.tabBar.hidden = YES ;

第三种:把代码写在将要跳转的控制器里面写上

     -(void)viewWillAppear:(BOOL)animated
     {
         [super viewWillAppear:animated];

         self.tabBarController.tabBar.hidden = YES ;
     }

技术点6:在我们进行push切换控制器的时候怎么解决导航栏标题长的问题???

  • 比如下面的“消息”这个标题,当进入第二个控制器的时候如果它很长,怎么解决???以及后面更多的控制器又要怎么解决
第一个控制器
第二个控制器

解决办法:(系统的方法不能给backBarButtonItem)

  • 1.新建一个继承于UIViewController的类 ,在它的ViewDidLoad里面写上下面的代码,让其他的控制器继承于它,而UITabViewController不能继承与它,这样表视图的下一个控制器就无法设置自定义的“返回”;

backBarButtonItem只接受字体的赋值,比如说“返回”,其他的比如说图片,系统的button都不接受

//建一个普通的的button给导航栏的 self.navigationItem.backBarButtonItem
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(click)];
self.navigationItem.backBarButtonItem = backItem;
  • 2.对于上面的问题作出了如下的解决办法
    在UITabViewController类的里面单独设置下一个控制器的返回按钮,也就是上面的代码在表视图的控制器里面再写一遍。

扩展:有关导航栏上UIButtonItem的各类设置(button的添加)

  • 1 设置一个自定义的button放在NavigationBar上:使后面的控制器都变为返回
转化前
转化后
    UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(click)];
    
    //第一:把自定义的button给系统的返回按钮
    self.navigationItem.backBarButtonItem = backItem;
    
    //第二:随意放在左右两个位置
    self.navigationItem.leftBarButtonItem = backItem;
    self.navigationItem.rightBarButtonItem = backItem;

    -(void)click
    {
        NSLog(@"实现什么功能以及其他的什么自己就设置");
    }
  • 2.系统的buttonItem(不可以随便放)

       UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(click)];
    

    第一:不能给backBarButtonItem
    第二:可以设置左右位置和上面的一样

  • 3.设置一个自定义的图片作为返回按钮??????难点???待解决

解决办法:建类来继承,效果和代码均如下

转化前

特别强调图片渲染的问题(在此又产生了一个问题:怎么让选中的左右两个按钮在选中的情况下都是高亮的状态???在下面技术点七讲解)

转化后(具有返回功能,在方法里面展示了,右侧还添加了一个更多
- (void)viewDidLoad {
   [super viewDidLoad];
  
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[[UIImage imageNamed:@"navigationbar_back"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self  action:@selector(click)];

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[[UIImage imageNamed:@"navigationbar_more"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(clickMore)];

}
  
  -(void)click
  {
     [self.navigationController popViewControllerAnimated:YES];
  }

技术点7:上个问题的遗留??导航栏上点住高亮如何设置???(也是切换图片)

  • 解决办法:新建button,坑:(1.自定义的button一定要设置size,2.方法是setBackgroundImage,不再是setImage,,如过不用切换图片则initWithImage即可,3.button大小的设置,)

代码如下:(添加多张图片要选择initWithCustomView)

//设置图片

UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];

[backBtn addTarget:self action:@selector(clickBack) forControlEvents:UIControlEventTouchUpInside];

[backBtn setBackgroundImage:[UIImage imageNamed:@"navigationbar_back"] forState:UIControlStateNormal];

[backBtn setBackgroundImage:[UIImage imageNamed:@"navigationbar_back_highlighted"] forState:UIControlStateHighlighted];

//设置尺寸
CGSize size = backBtn.currentBackgroundImage.size;

backBtn.frame = CGRectMake(0, 0, size.width, size.height);

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:backBtn];

技术点8: 上面两个技术点在单个控制器和部分控制器可以适用,但是在“继承的时候”跳转到一些其他控制器就不适合了???

  • 问题分析:(控制器就不要继承了)
    以后在遇到UIController就不要再考虑继承的问题了,因为继承本身是有问题的;比如说进入TableViewController的类(tableView 就不存在了)

  • 解决办法

统一所有控制器导航栏左上角和右上角的内容(最好的方法)

(1) 让所有push进来的控制器,它导航栏左上角和右上角的内容一样(类似返回按钮)。

(2) 拦截所有push进来的控制器。

(3) 方案:自定义导航控制器重写push的方法就可得到传进来的控制器参数。

方法:

-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{

     具体的操作写在这里(  )

     重点提一下:
     
     1. 每次控制器push的时候都会来到这里,而这里的viewController  代表那个控制器的对象

     2. self.viewControllers.count 代表在导航控制器里面的控制器个数

     3. self 在这里代表 单个控制器里面的self.navigationController

}

技术点9:如何消除tabView 左边有空格的问题???

方法如下:

消除左边空格的影响
- (void)viewDidLoad {
[super viewDidLoad];

if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    
    [self.tableView setSeparatorInset:UIEdgeInsetsZero];
}

if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
    
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
    }

}

- (void)tableView:(UITableView *)tableView willDisplayCell:  (UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
 {
      if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
     
         [cell setSeparatorInset:UIEdgeInsetsZero];
     }

      if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
    
      [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

技术10:怎么把一个一个方法封装起来???

分析:下面是一个方法

-(UIBarButtonItem *)setbutton:(NSString *)backImage BackHighlightedImage:(NSString *)backHighlightedImage action:(SEL)action
{

   UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

   [button addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];

   [button setBackgroundImage:[UIImage imageNamed:backImage] forState:UIControlStateNormal];

   [button setBackgroundImage:[UIImage imageNamed:backHighlightedImage] forState:UIControlStateHighlighted];

    CGSize size = button.currentBackgroundImage.size;

    button.frame =CGRectMake(0, 0, size.width, size.height);

    return [[UIBarButtonItem alloc]initWithCustomView:button];
}

解决办法:建一个类进行封装 继承于 NSObject ,分别声明和实现,把减号(-)改为加号(+);有坑:里面的SE不能实现,解决办法:把调用的控制器也传进来作为参数Target:(id)target ,注意里面方法选择器的参数如何设置???

  • 如截图:不要害怕,我只是改动很小,看上面的解决办法
封装类的.h 文件
封装类的.m文件
调用,仅仅把原来的self换成自定义的类名

重点可以把上面的进行建立分类,增加方法

增加分类
  • 把建好的分类导入到pch文件里面(再调用的话就不再用类名了,而是UIBarButtonItem)
建立分类之后的调用

技术点11.怎么设置导航栏右上角字体的颜色??

  • 分析:系统默认渲染成蓝色。要想设置我们所需要的颜色需要寻找方法。
  • 解决办法:正常状态下咱们根据需要设置颜色,如果在点击设置应该是organge颜色。因为需要设置主题色,所以就在导航栏里面设置所有的字体颜色,下面的方法放在导航控制器的.m里面
改变之前的字体颜色
设置颜色之后未点击时的字体颜色
设置颜色之后在点击的时候颜色
/*

 设置导航栏文字的颜色以及文字大小(如导航的背景颜色,以及导航栏中间字体的颜色)
 [UINavigationBar appearance];
 设置Item的样式
 [UIBarButtonItem appearance];

*/

//在第一次使用调用一次(tabBar的个的控制器navigationController写下面的方法)
+(void)initialize
{
    //设置整个项目所有item的主题样式()
    UIBarButtonItem *item = [UIBarButtonItem appearance];

    //设置普通状态的字体颜色和大小

    NSMutableDictionary *textAttrs = [NSMutableDictionary dictionary];

    textAttrs[NSForegroundColorAttributeName] = CWColor(123, 123, 123);

     textAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:22];

     [item setTitleTextAttributes:textAttrs forState:UIControlStateNormal];

     //设置点击的时候颜色和大小
     NSMutableDictionary *textAttrsSeleced = [NSMutableDictionary dictionary];

     textAttrsSeleced[NSForegroundColorAttributeName] = CWColor(252, 108, 8);

     textAttrsSeleced[NSFontAttributeName] = [UIFont systemFontOfSize:22];

     [item setTitleTextAttributes:textAttrsSeleced forState:UIControlStateSelected];

 }
  • 以字典的形式书写出来更好,也更方便


    上面的设置颜色和大小可以这样设置更简洁

技术点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
自定义NSLog,提高运算的性能

技术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];
    
window遮盖了其他的一切
不能左右拉伸
  • 只需要把颜色设置为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"]) {
    
    //在此可以设定指定的时间做某些事情
  }
}

技术24.版本特性指什么??四舍五入(int)(number+0.5)(只适用1位小数)

  • 分析:版本顾名思义就是程序的新版本,也可以理解为首页登录的导航图

  • 具体的做法,进行了封装。存到github上面了,可以查看,稍后附上链接

里面会涉及到四舍五入(只适用1位小数),具体的做法是,四舍五入:加0.5再强转,如(int)(number+0.5)

举个例子:

原数        加0.5     求和      舍去小数(得到四舍五入的数字)
    
 1.3     1.3+0.5     =    1.8        1
 1.5     1.5 +0.5    =    2.0        2
 1.6     1.6 + 0.5   =    2.1        2
 0.7     0.7 + 0.5   =    1.2        1

四舍五入(只适用1位小数) 如果是1.66 ,则(1.66+0.5)*10取整,再取一位小数,再按照上面的

技术25.如果发现一个控制器添加到另外一个控制器,但是它的数据却没有了?怎么解决??那么把一个控制器添加到另外一个控制器又有什么价值呢???

  • 分析:极大可能是因为控制器被提前销毁了(俗称程序控制器坏死)

解决办法:需要定义下面的控制器属性

 先定义    
@property(nonatomic,strong)MeasageViewController *measageViewController;
再懒加载
-(MeasageViewController *)measageViewController
{

if (!_contactViewController) {
    
    _measageViewController = [[MeasageViewController alloc]init];
    
    _measageViewController.view.frame = self.view.frame;
}

    return _measageViewController;

}

最后在viewDidLoad 添加就好了

  • 需要注意的地方:控制器的view还在,但是view上面的数据不显示,极大可能是因为控制器被提前销毁了
  • 1.一个控制器的view是可以随意调整尺寸和位置的
  • 2.一个控制器的view是可以随意添加到其他view中
  • 3.如果将一个控制器的view,添加到其他view中显示,那么要想办法保证不被销毁
  • 4.原则:只要view在,view所在的控制器必须的在,这样才能保证view内部的数据和业务逻辑正常

技术26:关于图片的一些设置以及加载方式‘

解析:

程序启动会自动加载叫做Default.png的图片
3.5inch retain 屏幕:Default@2x.png
3.5inch 非retain屏幕:Default.png
4.0inch retain 屏幕:Default-568h@2x.png

只有程序启动时自动去加载的图片才会查找-568h@2x.png

技术27.点击切换一个Button两种状态下的图片

分析:效果图

点击前的图片

点击后的图片
  • 解决办法:设置两张图片,分别为选中UIControlStateSelected和未选中下UIControlStateNormal

比如下面的代码:

  UIButton  *_shareBtn = [[UIButton alloc]init];
  _shareBtn.frame = CGRectMake(CWKWindowWidth*(KImageCount-1)+CWKWindowWidth*0.5-93,CWKWindowHeight*0.7, 186, 42.5);
  [_shareBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  [_shareBtn setImage:[UIImage imageNamed:@"unchecked_checkbox"] forState:UIControlStateNormal];
  [_shareBtn setImage:[UIImage imageNamed:@"checked_checkbox"] forState:UIControlStateSelected];
  [_shareBtn setTitle:@"分享" forState:UIControlStateNormal];
  [_shareBtn addTarget:self action:@selector(shareClick:) forControlEvents:UIControlEventTouchUpInside];

 -(void)shareClick:(UIButton *)shareBtn
 {
     shareBtn.selected = !shareBtn.isSelected;
 }
  • 重点代码:shareBtn.selected = !shareBtn.isSelected;

技术28. 如何让图片和分享这两个字有一定的距离??

分析:在button上面加载图片用image,而button上面覆盖图片用backgroundImage,在此要用到titleEdgeInsets这个属性,用法如下:

1728484-2cf3b340b3975375.png
  • 具体的用法(有关button里面三种属性的用法,以及区别)

    //1.contentEdgeInsets:(自切:切除的就不能用了,也就是不能放东西)会影响按钮内部的所有内容(里面的imageView和titleLabel)
    //切多少就有多少不能被用,相当于留出多余的面积
    //button.contentEdgeInsets = UIEdgeInsetsMake(10, 0, 0, 0);

    //2.titleLabelEdgeInsets 只影响按钮内部的titleLabel

    button.titleEdgeInsets = UIEdgeInsetsMake(5,20, 0, 0);

    //3.imageEdgeInsets 只影响按钮内部的imageView

    button.imageEdgeInsets = UIEdgeInsetsMake(20,0, 0, 50);

技术29.一个空间看不见的可能性有哪些???

  • 分析:如下可能性很多
 /*
 * 1.根本没有创建实例化这个控件
 *
 * 2.没有设置尺寸 UIPageControl没设置尺寸也会出来
 *
 * 3.控件的颜色可能跟父控件的颜色一样
 *
 * 4.控件的透明度为alpha <= 0.01;
 *
 * 5.hidden = YES 
 *
 * 6.没有添加到父控件中
 *
 * 7.这个控件被其他控件挡住了
 *
 * 8.位置不对(指坐标)
 *
 * 9.父控件发生了以上的情况
 *
 * 10.特殊情况:image设置了,但是图片没有设置,就无法显示
 *
 * UIImageView没有设置image属性,或者设置的图片名字不对
 * 
 * UILabel没有设置文字,或者文字的颜色和父控件的颜色一样
 *
 * UITextFiled没有设置文字,或者没有设置边框样式borderStyle
 *
 * UIPageControl没有设置页码,不会显示小圆点
 *
 * UIButton内部imageView和titleLabel的frame被篡改了,或者imageView和titlleLabel没有内容
 *
 */

技术30.如何让UITextView大文本输入框一直可以显示内容且内容一直会显示最后一行的内容?

大文本显示框
  • 分析: 只需要让文本内容一直叠加换行。最主要的是显示最后一行

定义三个全局的变量:

int count;
NSTimer *timer;
UITextView *textView;//之后执行下面的

  {
     timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];

     count = 0;

     textView = [[UITextView alloc]initWithFrame:self.view.bounds];

     textView.font = [UIFont systemFontOfSize:25];

     [self.view addSubview:textView];

  }
  -(void)updateTime
  {

       count ++;

       NSLog(@"%d",count);

        NSString *text = textView.text;

        textView.text = [text stringByAppendingFormat:@"%d \n",count];

        NSRange range;
 
       range.length = textView.text.length;

       [textView scrollRangeToVisible:range];

   }

技术31.版本新特性如何设定??(也就是新手导航与版本更新)

版本新特性的走向
求版本的特性
  • 具体的代码

    Appdelegate.m 里面
    //1.重写window
     self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    
     //2.设置根控制器
     //获取上一次的使用版本 (储存在沙盒中的版本号)
    
    NSString *lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"CFBundleVersion"];
     //当前软件的版本号(从info.plist中获取)两种写法
    
     //1.NSString *currentVersion =  [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];
    
     NSDictionary *info = [NSBundle mainBundle].infoDictionary;
     //当前的version
     NSString *currentVersion = info[@"CFBundleVersion"];
    
     NSLog(@"%@",currentVersion);
    //只要不相等就是新特性
    if ([lastVersion isEqualToString:currentVersion]) {//版本号相同:这次打开和上次打开始同一个版本
     
            self.window.rootViewController = [[RootTabBarController alloc]init];
    }
    else//这次打开的版本和上次不一样,显示新的特性
    {
          //将当前的版本号存进沙盒
      
          [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"CFBundleVersion"];
     
         //立马把版本号存进去.不可少,少了可能出问题
         [[NSUserDefaults standardUserDefaults] synchronize];//synchronize |ˈsɪŋkrənaɪz| 使同步,使同时发生
     
         self.window.rootViewController = [[NewViewController alloc]init];
    }
    //3.显示window
    [self.window makeKeyAndVisible];
    

    //在新特性控制器里面 (点击button走这里)

    -(void)clickNewController
    {
      //    //获取到应用程序的delegate
      //    AppDelegate *delegate = [UIApplication sharedApplication].delegate;
      //    [delegate startChange];
    
      /*切换控制器的手段
        *
        * 1.push :依赖于UINavigationController,控制器的切换是可逆的,比如A切换到B,B又可以回到A
        *
        * 2.model:控制器的切换是可逆的,比如A切换到B,B又可以回到A,而且新特性又不可释放,占据内存
        *
        * 3.切换window的rootController,而且不可逆,且新特性的控制器被销毁
        *
        */
    
       UIWindow *window = [UIApplication sharedApplication].keyWindow;
    
       window.rootViewController = [[RootTabBarController alloc]init];
    
    }
    

技术32.微博数据请求的一些要求???

 什么样的应用才有资格被用户授权?
 1.注册一个新浪微博账号,成为新浪的开发者,
 2.登录开发者主页http://open.weibo.com/,创建一个应用
 3.创建完成后,会获得以下主要信息
 1>AppKey:应用的唯一标识,相当于应用的身份证
 2>APPsecret:
 3>RedirectURI(回调地址)

技术33.OAuth授权步骤

  • 第三方想访问服务提供商的用户资源时,需要先进行OAuth授权

  • OAuth授权的步骤总结就3点:

  • 1.获取未经授权的Request Token

  • 2.获取用户授权的Request Token

  • 3.用户授权的Request Token换取 Access Token(授权标记)
    (得到这个Access Token 就相当于得到了一个“令牌”,通过此“令牌”请求,就可以去拥有资源的网站抓取任意有权限可以被抓取的资源)

  • 对上面的解释

第一个解释
步骤二的讲解

下面是具体的步骤:

第一步

第二步

第三步

技术34.请求出现的错误(分析)

表示参数传错了
  • 分析:这种问题表示参数传错了或者是没有传参数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,473评论 1 14
  • 1.badgeVaule气泡提示 2.git终端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夹内容...
    i得深刻方得S阅读 4,631评论 1 9
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,516评论 25 707
  • 新修的高速路又宽又直,路中央的花坛里,盛开着移植来的各种鲜花。望着车窗外闪过的一座座高楼大厦,莲子惊异地发觉,这座...
    梦谷阅读 233评论 3 1
  • 在网上看到这么一句话,“让你哭到撕心裂肺的那个人,是你最爱的人;让你笑到没心没肺那个人,是最爱你的人。”这名话让我...
    的确良阅读 201评论 0 0