导航条根据UITableView或者UICollectionView的滑动变透明或者不透明
懒癌晚期,实在懒得写了,只把效果和代码放上来了~
// // MallRecommendViewController.m // DiDong // // Created by 岳霖 on 2017/10/9. // Copyright © 2017年 岳霖. All rights reserved. // #import "MallRecommendViewController.h" #import "MallHeaderView.h" #import "ProductsCell.h" #import "MallSearchHistoryViewController.h" @interface MallRecommendViewController () <UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,UITextFieldDelegate> { UIImageView *_barImageView; } @property (nonatomic, strong) UICollectionView *collectionView; @property (nonatomic, strong) UIImageView *headerImageView; @property (nonatomic, strong) UICollectionReusableView *headerView; @property (nonatomic, strong) UITextField *searchTf; @property (nonatomic, strong) UIView *fakeNavigationBar; //@property (nonatomic, strong) UIButton *backButton; @property (nonatomic, strong) UIImageView *searchIcon; #define SearchTfBgColor_Deep [UIColor colorWithHex:0xf7f7f7] #define SearchTfBgColor_Low [UIColor colorWithWhite:1 alpha:0.2] #define PlaceHolderColor_Deep [UIColor colorWithHex:0xc5c5c5] #define PlaceHolderColor_Low [UIColor whiteColor] #define SearchIcon_Deep @"mall_sousuo_huise" #define SearchIcon_Low @"mall_sousuo_icon" #define BackIcon_Deep @"fanhuiheise_shouye" #define BackIcon_Low @"fanhui_shouye" #define BannerHeight 230 @end @implementation MallRecommendViewController - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // self.navigationController.navigationBar.hidden = YES; // [self setFakeNavigationBar]; // CGFloat alpha = self.collectionView.contentOffset.y / 64.f; // _barImageView.alpha = alpha; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; NSLog(@"%f",_barImageView.alpha); CGFloat alpha = self.collectionView.contentOffset.y / 64.f; _barImageView.alpha = alpha; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self.view addSubview:self.collectionView]; [self.collectionView mas_updateConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(-64); make.left.and.right.and.bottom.mas_equalTo(0); }]; _barImageView = self.navigationController.navigationBar.subviews.firstObject; NSLog(@"%f",_barImageView.alpha); //iOS11下不能正确设置alpha为0.经过测试打印,在viewDidAppear之前,_barImageView的frame都是从0开始,alpha可以设置为0,但是并不能变成透明,到viewDidAppear方法中就从-20开始,alpha自动变成1,网上查资料得出来结果是在主线程中设置,测试有效 if (@available (iOS 11, *)) { dispatch_async(dispatch_get_main_queue(), ^{ _barImageView.alpha = 0; }); } NSLog(@"%f",_barImageView.alpha); } #pragma mark 设置导航条 - (void)setNavigationBar { [super setNavigationBar]; [self.navigationItem.leftBarButtonItem setImage:[[UIImage imageNamed:BackIcon_Low] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]]; [self.navigationController.navigationBar setShadowImage:[UIImage imageWithColor:[UIColor separatorColor]]]; self.navigationItem.titleView = self.searchTf; } #pragma mark 重写返回方法,让tabbar返回 - (void)leftItemAction { [self.parentViewController.navigationController popViewControllerAnimated:NO]; } /* #pragma mark 设置假的导航条 - (void)setFakeNavigationBar{ [self.view addSubview:self.fakeNavigationBar]; [self.fakeNavigationBar addSubview:self.searchTf]; [self.fakeNavigationBar addSubview:self.backButton]; [self.fakeNavigationBar mas_updateConstraints:^(MASConstraintMaker *make) { make.left.and.top.and.right.mas_equalTo(0); make.height.mas_equalTo(64); }]; [self.backButton mas_updateConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(0); make.right.equalTo(self.searchTf.mas_left); make.top.and.bottom.equalTo(self.searchTf); }]; [self.searchTf mas_updateConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(35); make.top.mas_equalTo(27); make.right.mas_equalTo(-15); make.height.mas_equalTo(30); }]; } #pragma mark 初始化假的导航条 - (UIView *)fakeNavigationBar { if (!_fakeNavigationBar) { _fakeNavigationBar = [[UIView alloc] init]; _fakeNavigationBar.backgroundColor = [UIColor colorWithWhite:1 alpha:0]; } return _fakeNavigationBar; } #pragma mark 初始化返回按钮 - (UIButton *)backButton { if (!_backButton) { _backButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_backButton setImage:[UIImage imageNamed:BackIcon_Low] forState:UIControlStateNormal]; [_backButton addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside]; } return _backButton; } - (void)backAction { [self.parentViewController.navigationController popViewControllerAnimated:YES]; } */ #pragma mark 初始化搜索框 - (UITextField *)searchTf { if (!_searchTf) { _searchTf = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 30)]; _searchTf.delegate = self; _searchTf.placeholder = @"搜索商品"; _searchTf.borderStyle = UITextBorderStyleNone; _searchTf.layer.masksToBounds = YES; _searchTf.layer.cornerRadius = 3; _searchTf.layer.borderColor = [UIColor clearColor].CGColor; _searchTf.font = [UIFont systemFontOfSize:12]; _searchTf.backgroundColor = [UIColor colorWithWhite:1 alpha:0.2]; _searchTf.leftViewMode = UITextFieldViewModeAlways; [_searchTf setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"]; UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(15, 8, 11, 12.5)]; imageView.image = [UIImage imageNamed:SearchIcon_Low]; [leftView addSubview:imageView]; self.searchIcon = imageView; _searchTf.leftView = leftView; } return _searchTf; } #pragma mark UITextFieldDelegat,点击textfield的时候推出新页面 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { MallSearchHistoryViewController *searchHistory = [[MallSearchHistoryViewController alloc] init]; UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:searchHistory]; navi.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; navi.modalPresentationStyle = UIModalPresentationCustom; [self presentViewController:navi animated:YES completion:nil]; return NO; } #pragma mark 初始化collectionView - (UICollectionView *)collectionView { if (!_collectionView) { UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; _collectionView.backgroundColor = [UIColor separatorColor]; layout.itemSize = CGSizeMake((SCREEN_WIDTH-0.5)/2, 191 * autoSizeScaleX); _collectionView.delegate = self; _collectionView.dataSource = self; [_collectionView registerClass:[ProductsCell class] forCellWithReuseIdentifier:@"cell"]; [_collectionView registerClass:[MallHeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"]; } return _collectionView; } #pragma UICollectionViewFlowLayout,UICollectionViewDataSource - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { ProductsCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath]; return cell; } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return 10; } - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section { return 0.5; } - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section { return 0.5; } - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { return UIEdgeInsetsMake(0.5, 0, 0.5, 0); } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { return CGSizeMake(SCREEN_WIDTH, BannerHeight); } - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { if (kind == UICollectionElementKindSectionHeader) { UICollectionReusableView *header = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:indexPath]; // if (!header) { // header = [[MallHeaderView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, BannerHeight)]; // } return header; } else { return [[UICollectionReusableView alloc] init]; } } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat minAlphaOffset = 0; CGFloat maxAlphaOffset = 64; CGFloat offset = scrollView.contentOffset.y; CGFloat alpha = (offset - minAlphaOffset) / (maxAlphaOffset - minAlphaOffset); // self.fakeNavigationBar.backgroundColor = [UIColor colorWithWhite:1 alpha:alpha]; _barImageView.alpha = alpha; if (scrollView.contentOffset.y > 32) { [self.navigationItem.leftBarButtonItem setImage:[[UIImage imageNamed:BackIcon_Deep] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]]; // [self.backButton setImage:[UIImage imageNamed:BackIcon_Deep] forState:UIControlStateNormal]; [self.searchIcon setImage:[UIImage imageNamed:SearchIcon_Deep]]; self.searchTf.backgroundColor = SearchTfBgColor_Deep; [self.searchTf setValue:PlaceHolderColor_Deep forKeyPath:@"_placeholderLabel.textColor"]; } else { [self.navigationItem.leftBarButtonItem setImage:[[UIImage imageNamed:BackIcon_Low] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]]; // [self.backButton setImage:[UIImage imageNamed:BackIcon_Low] forState:UIControlStateNormal]; [self.searchIcon setImage:[UIImage imageNamed:SearchIcon_Low]]; self.searchTf.backgroundColor = SearchTfBgColor_Low; [self.searchTf setValue:PlaceHolderColor_Low forKeyPath:@"_placeholderLabel.textColor"]; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ @end