一: 修改狀態(tài)欄的顏色
定義了一個(gè)全局的屬性記錄偏移量幻锁,然后在滾動的代理方法中賦值并且調(diào)用UIViewController
的 - (void)setNeedsStatusBarAppearanceUpdate
方法尝蠕。然后重寫系統(tǒng)的- (UIStatusBarStyle)preferredStatusBarStyle
方法侦香。在這個(gè)方法中去改變狀態(tài)欄的顏色。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
self.offset = scrollView.contentOffset.y;
[self setNeedsStatusBarAppearanceUpdate];
}
- (UIStatusBarStyle)preferredStatusBarStyle {
if (self.offset > 50) {
return UIStatusBarStyleDefault;
}
return UIStatusBarStyleLightContent;
}
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {
return UIStatusBarAnimationFade;
}
如果不是經(jīng)過導(dǎo)航欄包裝的控制器的話纺阔,到這里就可以實(shí)現(xiàn)根據(jù)偏移量修改狀態(tài)欄的顏色了。如果你的控制器是經(jīng)過導(dǎo)航控制器包裝的,你需要自定義一個(gè)導(dǎo)航控制器繼承自UINavigationController
撞蚕,重寫
- (UIViewController *)childViewControllerForStatusBarStyle
方法
- (UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
讓狀態(tài)欄的顏色由控制器自己去決定。
二:修改導(dǎo)航欄的背景色
首先讓導(dǎo)航欄是透明色过牙,因此在 viewWillAppear
中甥厦,
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//導(dǎo)航欄設(shè)置為透明
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
//去掉導(dǎo)航欄底部的黑線
self.navigationController.navigationBar.shadowImage = [UIImage new];
// 導(dǎo)航欄漸變色
[self setNavBackColor:self.offset];
}
注意:在視圖將要消失的時(shí)候,記得設(shè)置回來
-(void)viewWillDisappear:(BOOL)animated{
[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setShadowImage:nil];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGFloat offset = scrollView.contentOffset.y;
self.offset = offset;
[self setNavBackColor:self.offset];
}
#pragma mark --- 修改Navigation漸變色寇钉、狀態(tài)欄顏色
- (void)setNavBackColor:(CGFloat)offset{
CGFloat alpha = offset * 1 / 64.0;
if (alpha >= 1) {
alpha = 0.99;
}
UIColor *alphaColor = [UIColor colorWithWhite:1 alpha:alpha];
UIImage *alphaImage = [UIImage imageWithColor:alphaColor];
[self.navigationController.navigationBar setBackgroundImage:alphaImage forBarMetrics:UIBarMetricsDefault];
// 修改狀態(tài)欄的顏色
[self setNeedsStatusBarAppearanceUpdate];
}
- (UIStatusBarStyle)preferredStatusBarStyle {
if (self.offset > 50) {
return UIStatusBarStyleDefault;
}
return UIStatusBarStyleLightContent;
}
最后刀疙,如果要修改狀態(tài)欄的顏色,記得:
定義一個(gè)導(dǎo)航控制器繼承自UINavigationController
扫倡,重寫
- (UIViewController *)childViewControllerForStatusBarStyle
方法
UIImage Category
+ (UIImage *)imageWithColor:(UIColor *)color {
CGRect rect = CGRectMake(0, 0, 1.0f, 1.0f);
// 開啟位圖上下文
UIGraphicsBeginImageContext(rect.size);
// 開啟上下文
CGContextRef ref = UIGraphicsGetCurrentContext();
// 使用color演示填充上下文
CGContextSetFillColorWithColor(ref, color.CGColor);
// 渲染上下文
CGContextFillRect(ref, rect);
// 從上下文中獲取圖片
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
// 結(jié)束上下文
UIGraphicsEndImageContext();
return image;
}