解决TabBarButton图片渲染。iOS项目——基本框架搭建,ios基本框架搭建。

1.缓解TabBarButton图片渲染

iOS项目——基本框架搭建,ios基本框架搭建

  项目开发进程中,在成就iOS项目——项目支出条件搭建后,我们第一需考虑的便是我们的型的一体化框架和导航架构设计,然后以是基础及考虑功能模块的就。

少种植艺术:

同 导航架构设计

  一款App的领航架构设计应该是顺应人们的操作惯性和惠及操作的特征,也相应以竞相上更是合理和人性化。根据项目效益以及一贯不同,不同之App的领航设计应当采取不同之技术框架,目前较常见的领航框架主要有标签式、列表式、矩阵式三杀接近,如下图,具体每一样类似的特性和详情可参见:再也谈App导航设计

脚下资讯新闻类的倒端项目之主流App框架基本都是标签式的,这种类型的领航设计技术及大都还是通过TabBar
+
NavigationController框架进行搭建得,大家经常用及之微博、今日头长达等还是采取TabBar

  • NavigationController这样的框架。TabBar +
    NavigationController就是在相应TabBar上添加itemBar,每一个itemBar都是一个独立的模块,并且每一个itemBar都对应一个NavigationController。因为各一个itemBar的导航器都未相同,所以当是优先有TabBar
    再发生NavigationController。

  我们的型也属资讯类,所以我们的类别的框架为是运用TabBar +
NavigationController进行搭建。今天咱们的显要任务就是是增加建筑我们TabBar,如果使用系统自带的UITabBarController(官网文档戳这里),在采用过程发生瞬间几乎点得注意:

  • 各级一个barItem都必须呼应一个ViewController,可以是一般的ViewController,也堪是UINavigationController
  • barItem对应之ViewController或UINavigationController的frame如果由定义设置了,注意不要遮挡最下的TabBar条
  • barItem的逐条和丰富到UITabBarController的次第保持一致
  • 当添加的barItem个数 <=
    5个时,均匀分布于无限下的bar条上,如达到图所展示之4独
  • 当添加的barItem个数 >
    5个时,会就展示前四独增长的barItem,然后加上一个【more】,点击【more】弹来一个列表可挑选,并且列表的右手上比有一个【edit】按钮,点击后可以调动barItem的显得顺序,如下图所著,所以TabBar +
    NavigationController框架下之barItem个数最好不用跨越5个,否则用户体验不是死好

必威体育 1 
  必威体育 2

  • 添加itemBar对应之ViewController的道有少栽:一凡是用UITabBarController的 setViewControllers: 方法设置;二凡是用UIViewController的 addChildViewController: 方法上加子视图,也得实现增长到tabBar的力量,然而这种方法对barItem个数 >
    5的时刻,只会显前五只,剩下的未会见油然而生经常出,也无【more】按钮可以选择

演示代码如下,自定义一个TabBarController继承自UITabBarController,然后还写那 viewDidLoad 方法上加子视图和标签: 

@implementation XMGTabBarController

- (void)viewDidLoad {
    [super viewDidLoad];

    //添加4个item bar
    UITableViewController *vc0 = [[UITableViewController alloc] init];
    vc0.view.backgroundColor = [UIColor redColor];
    vc0.tabBarItem.title = @"精华";
    vc0.tabBarItem.image = [UIImage imageNamed:@"tabBar_essence_icon"];
    vc0.tabBarItem.selectedImage = [UIImage imageNamed:@"tabBar_essence_click_icon"];
    [self addChildViewController:vc0];

    UIViewController *vc1 = [[UIViewController alloc] init];
    vc1.view.backgroundColor = [UIColor blueColor];
    vc1.tabBarItem.title = @"新帖";
    vc1.tabBarItem.image = [UIImage imageNamed:@"tabBar_new_icon"];
    vc1.tabBarItem.selectedImage = [UIImage imageNamed:@"tabBar_new_click_icon"];
    [self addChildViewController:vc1];

    UITableViewController *vc2 = [[UITableViewController alloc] init];
    vc2.view.backgroundColor = [UIColor greenColor];
    vc2.tabBarItem.title = @"关注";
    vc2.tabBarItem.image = [UIImage imageNamed:@"tabBar_friendTrends_icon"];
    vc2.tabBarItem.selectedImage = [UIImage imageNamed:@"tabBar_friendTrends_click_icon"];
    [self addChildViewController:vc2];

    UIViewController *vc3 = [[UIViewController alloc] init];
    vc3.view.backgroundColor = [UIColor grayColor];
    vc3.tabBarItem.title = @"我";
    vc3.tabBarItem.image = [UIImage imageNamed:@"tabBar_me_icon"];
    vc3.tabBarItem.selectedImage = [UIImage imageNamed:@"tabBar_me_click_icon"];
    [self addChildViewController:vc3];

     //下面的方法也是可以的,推荐使用下面的方法
//    [self addChildViewController:@[vc0,vc1,vc2,vc3]];

}

1.直选中全部图片,修改一个性:Render as    选择:Original Image

第二 开发进程遭到注意代码重构

 在出进程中,我们太不要再写相同的代码,因此,在开进程中,我们用对我们的代码进行重构和简化,主要标准是不择手段保持一个措施实现一个成效,然后尽量不写重复的代码,精简逻辑。在咱们前添tabBar
item的代码中就在大量重复性的代码,所以我们要对那开展重构,将重复性的代码进行抽取,将不同的始末装成参数进行打定义设置,重构后的逻辑如下:

@implementation XMGTabBarController

- (void)viewDidLoad {
    [super viewDidLoad];

    /**** 添加子控制器 ****/
    [self setupOneChildViewController:[[UITableViewController alloc] init] title:@"精华" image:@"tabBar_essence_icon" selectedImage:@"tabBar_essence_click_icon"];
    [self setupOneChildViewController:[[UITableViewController alloc] init] title:@"新帖" image:@"tabBar_new_icon" selectedImage:@"tabBar_new_click_icon"];
    [self setupOneChildViewController:[[UIViewController alloc] init] title:@"关注" image:@"tabBar_friendTrends_icon" selectedImage:@"tabBar_friendTrends_click_icon"];
    [self setupOneChildViewController:[[UITableViewController alloc] init] title:@"我" image:@"tabBar_me_icon" selectedImage:@"tabBar_me_click_icon"];
}

/**
 *  初始化一个子控制器
 *
 *  @param vc            子控制器
 *  @param title         标题
 *  @param image         图标
 *  @param selectedImage 选中的图标
 */
- (void)setupOneChildViewController:(UIViewController *)vc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage
{
    vc.view.backgroundColor = [UIColor redColor];
    vc.tabBarItem.title = title;
    vc.tabBarItem.image = [UIImage imageNamed:image];
    vc.tabBarItem.selectedImage = [UIImage imageNamed:selectedImage];
    [self addChildViewController:vc];
}

@end

2.抽取UIImage分类,提供不要渲染之方法

三 UITabBarItem设置 

  以iOS开发过程中,系统自带的长空有时候会拿稍微图片展示出来时自动渲染成蓝色,例如自带的TabBarItem在当选时的图样,还有设置UIButtonTypeSystem样式时按钮的图,这时候系统都见面活动渲染成蓝色。

vc.tabBarItem.selectedImage = image;

UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
[btn setImage:image forState:UIControlStateNormal];

干什么而卷入到分类 ?    提高法的复用性

3.1 image的渲染问题  

  我们在开发进程遭到有时并不需要这种渲染,只望开之App按我们设定的图片进行展示就哼了,这是咱们虽得针对图纸展开取缔渲染的设定和操作。有有限栽缓解方案:

  • 再次有相同摆设不会见开展渲染之图纸

    // 加载图片
    UIImage *tempImage = [UIImage imageNamed:@"tabBar_essence_click_icon"];
    // 产生一张不会进行自动渲染的图片
    UIImage *selectedImage = [tempImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    vc.tabBarItem.selectedImage = selectedImage;
    
  • 一直当xcassets文件被配置图片未深受渲染

 

3.改插件   目的:让投机补加图的计,也产生插件的提拔功能

3.2 设置TabBarItem的契性

   于上述我们队图片修改以后,虽然tabBarItem的图形可以了本我们设定的图纸展开展示,但是
在付出进程遭到,我们有的是时节还索要针对tabBarItem的题的书体、字号等文字性进行设定。要设定tabBarItem的仿性,我们啊时有发生少种缓解方案:

  • 一直设置各一个tabBarItem对象

    // 普通状态下的文字属性
    NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];
    normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:14];
    normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];
    [vc.tabBarItem setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];
    
    // 选中状态下的文字属性
    NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
    selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];
    [vc.tabBarItem setTitleTextAttributes:selectedAttrs forState:UIControlStateSelected];
    

    需要留意的凡:

    // 字典中用到的key
    1.iOS7之前(在UIStringDrawing.h中可以找到)
    - 比如UITextAttributeFont\UITextAttributeTextColor
    - 规律:UITextAttributeXXX
    
    2.iOS7开始(在NSAttributedString.h中可以找到)
    - 比如NSFontAttributeName\NSForegroundColorAttributeName
    - 规律:NSXXXAttributeName
    
  • 经过UITabBarItem的appearance对象统一设置

    /**** 设置所有UITabBarItem的文字属性 ****/
    UITabBarItem *item = [UITabBarItem appearance];
    // 普通状态下的文字属性
    NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];
    normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:14];
    normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];
    [item setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];
    // 选中状态下的文字属性
    NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
    selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];
    [item setTitleTextAttributes:normalAttrs forState:UIControlStateSelected];
    

3.1哪找到插件的装置位置

3.3 UIAppearance

  只要一个好像遵守UIAppearance,就会获得全局的外观,UIview都得落有的外观,我们得取得具有的tabBarItem外观标识,但是,一般不要下面这种,因为下面这种措施获得的是大局的备tabBarItem外观标识,我们当开发时,一般还是温馨负责好开发的部分,所以推举以下第二栽艺术,只抱当前好像的tabBarItem外观标识。

//获取全局的tabBarItem外观标识
UITabBarItem *item = [UITabBarItem appearance];

//获取当前这个类下面的所有tabBarItem
UITabBarItem *item = [UITabBarItem appearanceWhenContainedIn:self, nil]

  appearance使用注意:一定要是于控件显示之前安装才产生因此,一般会放在+
(void)load方法被一经无放在+(void)initialize中,因为+
(void)load方法就见面调用一不成,+(void)initialize可能会见调用多次,使用时还需看清。

  • load方法:加载类的时候调用,类在什么时加载呢?程序一样起动就调用load方法
  • Initialize方法:初始化类,当第一蹩脚采用此类似还是子类的时刻调用
  • viewdidload方法:当viewcontroller第一坏将显示的时加载。viewController都是懒加载,即都是当将要显示出时才加载viewdidLoad,但是只有
    tabbarcontroller是以一如既往创控制器的时段就是开展加载viewdidLoad。

剖析:插件是安于处理器的达到的,安装至何,插件的道中肯定会供

季 pch文件之概念

  PCH文件(Precompile Prefix Header
File),也就是预编译头文件,其用意就是是,有利于而一次性导入在多只文件被以采用的条文件、宏或者URL地址等(全局使用),可以使得的辅您省时间,提高支付效率。但是,自从Xcode
5之后,这个文件默认就不再提供了,如果你还眷恋延续使用的话,需要手动创建并配置。至于怎么默认不再提供,可能是出于提高编译效率方面的考虑,毕竟预编译为会提高Build的工夫。

  具体哪些创造和部署PCH文件详情可瞻仰:ios中pch文件之开创同配置

  下面是于编写PCH文件需要专注的一些情况: 

#ifndef PrefixHeader_pch
#define PrefixHeader_pch

/*** 如果希望某些内容能拷贝到任何源代码文件(OC\C\C++等), 那么就不要写在#ifdef __OBJC__和#endif之间 ***/


/***** 在#ifdef __OBJC__和#endif之间的内容, 只会拷贝到OC源代码文件中, 不会拷贝到其他语言的源代码文件中 *****/
#ifdef __OBJC__


#endif
/***** 在#ifdef __OBJC__和#endif之间的内容, 只会拷贝到OC源代码文件中, 不会拷贝到其他语言的源代码文件中 *****/


#endif

找到插件的源代码,进入源代码搜索     搜索什么要字也?   在哪搜索?

五 在Build Setting中布局宏 

  宏定义除了当类似中之所以#define进行定义之外,在iOS开发过程遭到,我们尚足以经过当Build
Setting中展开配置宏,而当Build
Setting中定义的宏在项目蒙会找不交,就是我们通过【command】+【鼠标单击】会显得一个【?】,无法超越到对应定义的职位,这时候可能就是是布在Build
Setting中,例如我们常见到的宏 DEBUG 就布局当布置在Build Setting中。

注意点:Build
Setting中配置的宏的名字不可知整个凡是小写字母
,如果宏的讳全部凡是聊写,
会出现以下错误 

 

http://www.bkjia.com/IOSjc/1300877.htmlwww.bkjia.comtruehttp://www.bkjia.com/IOSjc/1300877.htmlTechArticleiOS项目——基本框架搭建,ios基本框架搭建
项目开过程中,在好 iOS项目类别开发条件搭建
之后,我们先是得考虑的就算是咱的项目…

command+f 搜索?   不得以  只能当时类似中找

全局搜索点放大镜图标搜索和路径相关的重点字,一个一个尝试一下(path,file)  
 试过以后发现 install_path能找到安装路径

以后察觉LIBRARY(library)这个文件找不交?       其实这文件就是资源库

当马上前面如果事先了解怎么咱们电脑的目录(文件夹名字)有的是中文,有的是英文??

第一使事先安装好之计算机隐藏的文本可见,  
然后发觉中文的文书夹下还来一个本地化文件

本地化文件:会依据电脑安装的言语,把公文夹名称翻译成对应之言语

俺们把资源库中之之文件去就意识资源库名称改成了library了

2.解决TabBarButton标题渲染

顾题目为渲染成蓝色,我们顿时使想开这是TabBar的主题颜色(默认是蓝色)tintColor

那我们且设置标题的习性

按钮标题 => 按钮内容 => 对应子控制器的tabBarItem

怎么设置按钮标题颜色?     一蹩脚只能设置一个

透过tabBarItem:模型可以设置那么通过哪个属性修改为?

咱得以进tabBarItem头文件去搜寻,但是找不交    
 那么我们即便去tabBarItem它的父类去寻觅, 找到一个计

– (void)setTitleTextAttributes:(nullable NSDictionary *)attributes
forState:(UIControlState)state NS_AVAILABLE_IOS(5_0)
UI_APPEARANCE_SELECTOR;

Attributes富文本:可以设置文字颜色,字体,阴影,图文混排

叙文本属性,通过key,和value去设置文字性

NSMutableDictionary*attr = [NSMutableDictionarydictionary];

attr[NSForegroundColorAttributeName] = [UIColorblackColor];

[itemsetTitleTextAttributes:attrforState:UIControlStateSelected];

岂用到持有的TabBarButton?

拿不交TabBarButton,我们只好用到TabBarItem
,并且知道修改TabBarItem能达标修改TabBarButton的目的(MVC思想)

只是修改TabBarItem一软只能修改一个,如何一次性修改所有的TabBarItem?

可以通过+
(
instancetype)appearance;此看似方式以到持有的TabBarItem

// 获取所有UITabBarItem

UITabBarItem*item = [UITabBarItemappearance];

只顾:通过选中状态设置文字字体是深的,没有效果

NSMutableDictionary*attr = [NSMutableDictionarydictionary];

字典的key值怎么传??   ——> 看这个方法的描述——>using the keys found
in NSAttributedString.h.

——>去之看似中找到队形的key       UIkit—>NSAttributedString.h

attr[NSFontAttributeName] = [UIFontsystemFontOfSize:13];

[itemsetTitleTextAttributes:attrforState:UIControlStateNormal];

除非由此Normal状态下设置才行

attr[NSForegroundColorAttributeName] = [UIColorblackColor];

[itemsetTitleTextAttributes:attrforState:UIControlStateSelected];

惟有以显示之前安装才见面立竿见影一般我们把这些设置写以+(void)load  方法中  
这个主意只有会加载一百分之百

// 什么时调用:第一蹩脚加载类的时节调用

// 只会调用一坏

+ (void)load  {  }

// 什么时调用:第一浅使用类或者它们的子类的时节调用

// 有或会见调用多次

+ (void)initialize {  }

注意点:

1.旁对象都能采用appearance吗?

无是   只有遵守UIAppearance协议 (或父类遵守)  才能够采取appearance

2.其他性质都足以利用appearance设置也?

不能

3.怎么样性可以经appearance设置?    ——>去探访属性之别

单单来隐含UI_APPEARANCE_SELECTOR宏属性,才会去装必威体育

4.一旦采取appearance设置属性,必须使以展示之前去设置.

5.用到appearance设置某些性能,那这些性在普工程中还见效

3.修改TabBarButton的位置

察觉TabBar中间位置设置了图片未显———>原因是图形为渲染———>为什么正常状态下图片会让渲染———>图片太好(图片超出了TabBar的限制)

图片位置怎么改———>修改frame———>此方式不可行———>那么还有那些方法可修改图片的岗位为??

改图片的内间距    可以办到      那么是特性名字是啊??
 ———>去头文件找——> 找不交就夺父类找

我们找到imageInsetsz这个特性可以修改

vc2.tabBarItem.imageInsets=UIEdgeInsetsMake(7,0, -7,0);

顾:有些上我们找到了能为此之性能,但是咱通过一个目标也束手无策调用这个特性

故:调用对象非针对.    我们进头文件去找到的性可能是其他类的习性  
我们设就此相应的类对象去调用这个特性

岂找到真正会调用属性的切近对象??       一直往上找寻,找到interface  
interface后面的虽是其一目标

相关文章

Leave a Comment.