一: 修改狀態欄的顏色
定義了一個全局的屬性記錄偏移量,然后在滾動的代理方法中賦值并且調用UIViewController
的 - (void)setNeedsStatusBarAppearanceUpdate
方法。然后重寫系統的- (UIStatusBarStyle)preferredStatusBarStyle
方法。在這個方法中去改變狀態欄的顏色。
- (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;
}
如果不是經過導航欄包裝的控制器的話,到這里就可以實現根據偏移量修改狀態欄的顏色了。如果你的控制器是經過導航控制器包裝的,你需要自定義一個導航控制器繼承自UINavigationController
,重寫
- (UIViewController *)childViewControllerForStatusBarStyle
方法
- (UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
讓狀態欄的顏色由控制器自己去決定。
二:修改導航欄的背景色
首先讓導航欄是透明色,因此在 viewWillAppear
中,
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//導航欄設置為透明
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
//去掉導航欄底部的黑線
self.navigationController.navigationBar.shadowImage = [UIImage new];
// 導航欄漸變色
[self setNavBackColor:self.offset];
}
注意:在視圖將要消失的時候,記得設置回來
-(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漸變色、狀態欄顏色
- (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];
// 修改狀態欄的顏色
[self setNeedsStatusBarAppearanceUpdate];
}
- (UIStatusBarStyle)preferredStatusBarStyle {
if (self.offset > 50) {
return UIStatusBarStyleDefault;
}
return UIStatusBarStyleLightContent;
}
最后,如果要修改狀態欄的顏色,記得:
定義一個導航控制器繼承自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();
// 結束上下文
UIGraphicsEndImageContext();
return image;
}