知识点总结:03-按钮的设置和导航控制器pop手势

2016-12-13  本文已影响19人  枫之叶_小乙哥

0.OC中两种获取类的方式

D2380F74-785F-4FF7-A062-FAEF550BC7D1.png

1.控制台可能会输出以下警告信息

// 没有输入图片名
CUICatalog: Invalid asset name supplied: (null)
CUICatalog: Invalid asset name supplied: (null)
// 图片名是空
CUICatalog: Invalid asset name supplied:
CUICatalog: Invalid asset name supplied:

2.准确判断一个字符串是否有内容

if (string.length) {
  // doSomething
}

/*
错误写法:
if (string) {
    // 这相当于判断string是否为nil,但是忽略了string为""的情况
}

// -> 如果是数组,则是array.count
*/
C1C6F8D5-A982-48DE-A483-259DB275947A.png

4.center和size的设置顺序

5.给系统的自带的类增加分类(以UIView为例,用OC文件创建分类,如果是写单例Manager则创建自定义类继承NSObject)

C3F422E2-3CD2-48DF-82CE-457C01538731.png
@interface UIView (XMGExtension)
@property (nonatomic, assign) CGFloat zgk_width;
@property (nonatomic, assign) CGFloat zgk_height;
@property (nonatomic, assign) CGFloat zgk_x;
@property (nonatomic, assign) CGFloat zgk_y;
@property (nonatomic, assign) CGFloat zgk_centerX;
@property (nonatomic, assign) CGFloat zgk_centerY;
@property (nonatomic, assign) CGFloat zgk_right;
@property (nonatomic, assign) CGFloat zgk_bottom;
@end

- 这样做的好处有两个:
         1.跟系统的属性区分开来,例如避免苹果为UIView添加相同名字的属性
         2.看就知道这个是自己写的分类

6.按钮常见的访问方法

错误示范:(不知道image是赋值给什么状态下的btn)


A08EA744-192F-4871-A8BC-410071733C4E.png

正确示范:

/** navigationController中设置返回按钮 **/
 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (self.childViewControllers.count > 0) { // 如果viewController不是最早push进来的子控制器
        // 左上角
        UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [backButton setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal];
        [backButton setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted];
        [backButton setTitle:@"返回" forState:UIControlStateNormal];
        [backButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [backButton setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
        [backButton sizeToFit];
        // 这句代码放在sizeToFit后面
        backButton.contentEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0);
        [backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
        viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
        
        // 隐藏底部的工具条
        viewController.hidesBottomBarWhenPushed = YES;
    }
    
    // 所有设置搞定后, 再push控制器
    [super pushViewController:viewController animated:animated];
}
// 获取btn正常状态下的图片
[button imageForState:UIControlStateNormal].size;
button.currentImage.size;

// 获取btn正常状态下的背景图片
[button backgroundImageForState:UIControlStateNormal];
button.currentBackgroundImage;

// 获取btn正常状态下的文字
[button titleForState:UIControlStateNormal];
button.currentTitle;

// 获取btn正常状态下的文字颜色
[button titleColorForState:UIControlStateNormal];
button.currentTitleColor;

7.为什么要设置navgationController作为tabBarController的子控制器呢?因为要要设置导航栏标题,所以要在每个子控制器中设置navgationItem.title属性

991274FE-A7E9-4E91-8E6E-DB793D17164C.png

从上述结构转变为下面结构:

F72FEF2F-4E2A-4DD4-A89F-BA5923F0167F.png C3231499-E84A-42BD-8996-8F80AD9EC421.png

从上述代码转变为下面代码:


F6CF4694-7A8B-4421-BD05-E605EDC11D8C.png E080E072-87DA-4113-8088-843F6F12E786.png
 /**** tabBarController.tabBar通过添加子控制器,来设置tabBar导航栏的内容 ****/

    /**在UITabBarController中**/
    [self setupOneChildViewController:[[UITableViewController alloc] init] title:@"精华" image:@"tabBar_essence_icon" selectedImage:@"tabBar_essence_click_icon"];

- (void)setupOneChildViewController:(UIViewController *)vc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage
{
    vc.view.backgroundColor = XMGRandomColor;
    vc.tabBarItem.title = title;
    if (image.length) { // 图片名有具体值
        vc.tabBarItem.image = [UIImage imageNamed:image];
        vc.tabBarItem.selectedImage = [UIImage imageNamed:selectedImage];
    }
    // tabBarController.tabBar通过添加子控制器,来设置tabBar的内容 
    [self addChildViewController:vc];
}
/** navigationController的栈顶控制器中设置导航栏内容 **/ 
- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = XMGCommonBgColor;
    
    // 标题
    self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MainTitle"]];
    // 左边
    self.navigationItem.leftBarButtonItem = [UIBarButtonItem itemWithImage:@"MainTagSubIcon" highImage:@"MainTagSubIconClick" target:self action:@selector(tagClick)];
}

8.设置按钮的内边距

// btn中内容的内边距(包括图片和文字)
@property(nonatomic) UIEdgeInsets contentEdgeInsets UI_APPEARANCE_SELECTOR;
// btn中文字的内边距
@property(nonatomic) UIEdgeInsets titleEdgeInsets;
// btn中图片的内边距
@property(nonatomic) UIEdgeInsets imageEdgeInsets;

9.不建议用self.title来修改navigationBar导航栏的标题,因为它会同时修改其他tabBarbar中的按钮标题

10.设置返回按钮的两种方法

17F4967C-4872-42C5-BAED-F9FB6268C6A8.png EEB6BBC2-16F8-44BC-8776-15B8CF83EC85.png

第二种方法将按钮数组直接穿进去,不用设置frame,推荐使用.

11.因为返回按钮经常用到,如果要统一设置自定义返回按钮(如果不自定义返回按钮,则返回的按钮会显示上个控制器的标题,而不是"返回"字眼),有两种方法:自定义类和分类

51F11E81-600D-4587-9E5C-1D284A6E33DA.png B18AA519-7645-4968-A10D-00579C4EEB5E.png

设置左边返回按钮需要注意的方面

B0B543E0-FB9F-4B99-A214-9C9E51CA5057.png
注意点:
1.设置返回按钮的不是简单的"返回",而是"箭头+返回",因此要设置image和title属性,并且要分状态
2.如果要设置图片不在左边在上面,文字在下面,则要自定义按钮 
3.设置按钮的内边距,可以调节返回按钮的布局,距离左边近一点,有图片内边距,有文字内边距,有内容内边距,用内容内边距 
4.在当前控制器设置,导航条的返回按钮
5.设置内边距的代码要放在sizeTofit之后,在根据内容确定大小后,再设置内边距,达到美观的效果.

12.自定义navigationViewController来统一设置返回按钮,这样就不用在每个navigationViewContrller的子控制器中设置返回按钮

/**
 *  重写push方法的目的 : 拦截所有push进来的子控制器
 *
 *  @param viewController 刚刚push进来的子控制器
 */
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (self.childViewControllers.count > 0) { // 如果viewController不是最早push进来的子控制器
        // 左上角
        UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [backButton setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal];
        [backButton setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted];
        [backButton setTitle:@"返回" forState:UIControlStateNormal];
        [backButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [backButton setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
        [backButton sizeToFit];
        // 这句代码放在sizeToFit后面
        backButton.contentEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0);
        [backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
        viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
        
        // 隐藏底部的工具条
        viewController.hidesBottomBarWhenPushed = YES;
    }
    
    // 所有设置搞定后, 再push控制器
    [super pushViewController:viewController animated:animated];
}

13.解决导航控制器pop手势失效(自定义导航控制器)

#import "ZGKNavigationController.h"

- (void)viewDidLoad {
    [super viewDidLoad];    
    self.interactivePopGestureRecognizer.delegate = self;
    
    [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];
}

#pragma mark - <UIGestureRecognizerDelegate>
/**
 *  手势识别器对象会调用这个代理方法来决定手势是否有效
 *
 *  @return YES : 手势有效, NO : 手势无效
 */
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
//    if (self.childViewControllers.count == 1) { // 导航控制器中只有1个子控制器
//        return NO;
//    }
//    return YES;
    
    // 手势何时有效 : 当导航控制器的子控制器个数 > 1就有效
    return self.childViewControllers.count > 1;
}

14.为什么要设置navigationBar和tabBar的背景颜色

/** 自定义navigationViewController中的代码 **/
 @implementation XMGNavigationController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.interactivePopGestureRecognizer.delegate = self;
    [self.navigationBar setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];
}
/** 自定义tabBar中的代码 **/
#pragma mark - 初始化
- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        self.backgroundImage = [UIImage imageNamed:@"tabbar-light"];
    }
    return self;
}

15.其他需要注意的

6BD9F0C4-D9D5-4006-B9F4-8677477A3070.png
@property(nonatomic) UIEdgeInsets contentEdgeInsets UI_APPEARANCE_SELECTOR;
@property(nonatomic) UIEdgeInsets titleEdgeInsets;
@property(nonatomic) UIEdgeInsets imageEdgeInsets;
上一篇 下一篇

猜你喜欢

热点阅读