UINavigationController特性總結(1)

weixin_33866037發表於2016-07-25

1.translucent屬性

translucent是navigationBar的一個屬性,當賦值為YES時(預設值),navigationBar為半透明效果.當賦值為NO時,navigationBar為不透明效果.值得注意的是,這個屬性會影響到佈局.

translucent 顯示效果 佈局
NO 不透明 起始位置為64
YES 半透明 起始位置為0
1764130-9d27826aee6363d5.png
translucent
舉個栗子
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor orangeColor]];
    
    self.navigationItem.title = @"Hello World";
    self.navigationController.navigationBar.translucent = YES;//預設值為YES(半透明效果)
    
    CGFloat w = [UIScreen mainScreen].bounds.size.width;
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(8, 0, w-16, 220)];
    imageView.image = [UIImage imageNamed:@"hy.jpg"];
    [self.view addSubview:imageView];
}

@end
效果
translucent屬性設定為YES,(預設值)

圖片的y值為0,佈局的起始位置也是0

1764130-241508868c7f3bbd.png
半透明

translucent屬性設定為NO

效果為不透明,圖片的y值仍然設定為0,但是佈局的起始位置變成了64

1764130-d190cd0117c9dcc3.png
不透明


2.設定navigationBar的顏色

第一步:使用Quartz2D將顏色渲染成UIImage
第二步:使用navigationBar的setBackgroundImage:(nullable UIImage *) forBarMetrics:(UIBarMetrics)方法將這個顏色變成的圖片設定為navigationBar的背景圖片

舉個栗子
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor orangeColor]];
    
    self.navigationItem.title = @"Hello World";
    //註釋掉這句話,系統會根據背景色是否透明而自動設定這個值
    //self.navigationController.navigationBar.translucent = NO;
    
    CGFloat w = [UIScreen mainScreen].bounds.size.width;
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(8, 0, w-16, 220)];
    imageView.image = [UIImage imageNamed:@"hy.jpg"];
    [self.view addSubview:imageView];
    
    UIColor *color = [UIColor colorWithRed:0 green:0 blue:1 alpha:1];
    CGRect rect = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 64);
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
    
    //當color的透明度為1時(不透明),translucent自動為NO.當color的透明度小於1時,translucent自動為YES.
    NSLog(@"%d",self.navigationController.navigationBar.translucent);
}
效果和特別說明

特別說明:
不再設定 navigationBar 的translucent屬性, 當更改背景顏色的透明度時,系統會根據背景色是否透明而自動設定 translucent的屬性值.即當color的透明度為1時(不透明),translucent自動為NO.當color的透明度小於1時,translucent自動為YES.顯示效果和佈局的其實位置都符合本文第一小節的敘述.
效果:
以下效果1和效果2,程式碼上只有設定顏色的這一句的alpha有區別(分別為1.0 和0.7)
UIColor *color = [UIColor colorWithRed:0 green:0 blue:1 alpha:1];

1764130-4e3ed0ccf36b0cc5.png
效果1
1764130-a3791372d4d49f9c.png
效果2