导航栏渐变透明下拉image放大

2024-05-28 18:48

本文主要是介绍导航栏渐变透明下拉image放大,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、首先使用分类 对UINavigationBar 进行类扩展

@interface UINavigationBar (Background)- (void)cnSetBackgroundColor:(UIColor *)backgroundColor;- (void)cnReset;@end

#import "UINavigationBar+Background.h"
#import <objc/runtime.h>@implementation UINavigationBar (Background)static char overlayKey;- (UIView *)overlay{return objc_getAssociatedObject(self, &overlayKey);
}- (void)setOverlay:(UIView *)overlay{objc_setAssociatedObject(self, &overlayKey,overlay,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}- (void)cnSetBackgroundColor:(UIColor *)backgroundColor{if (!self.overlay) {[self setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];self.overlay = [[UIView alloc] initWithFrame:CGRectMake(0, -20, [UIScreen mainScreen].bounds.size.width, CGRectGetHeight(self.bounds)+20)];self.overlay.userInteractionEnabled = NO;self.overlay.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;[self insertSubview:self.overlay atIndex:0];}self.overlay.backgroundColor = backgroundColor;
}/***  释放*/
- (void)cnReset{[self setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];[self.overlay removeFromSuperview];self.overlay = nil;
}

2、在当前控制器中写入对UINavigationBar 与 图片的处理

#import "XXTableViewViewController.h"
#import "UINavigationBar+Background.h"#define SCREEN_RECT [UIScreen mainScreen].bounds
static const CGFloat headerImageHeight = 260.0f;@interface XXTableViewViewController ()<UITableViewDataSource,UITableViewDelegate>
{// 拉伸的底图UIImageView *headerImageView;
}
@end@implementation XXTableViewViewController- (void)viewWillAppear:(BOOL)animated{[super viewWillAppear:animated];self.mTableView.delegate = self;
}- (void)viewWillDisappear:(BOOL)animated{[super viewWillDisappear:animated];self.mTableView.delegate = nil;
}- (void)viewDidLoad {[super viewDidLoad];self.title = @"呵呵呵呵~~";//1、 去掉navigationbar 上的背景图片[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];//1.1、 去掉navigationbar 上图片下面的线self.navigationController.navigationBar.shadowImage = [UIImage new];self.mTableView.contentInset = UIEdgeInsetsMake(headerImageHeight, 0, 0, 0);self.mTableView.tableHeaderView = [[UIView alloc] init];headerImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,-headerImageHeight,CGRectGetWidth(SCREEN_RECT), headerImageHeight)];headerImageView.image = [UIImage imageNamed:@"headerImage"];// 高度改变  宽高也跟着改变headerImageView.contentMode = UIViewContentModeScaleToFill;//重点(不设置拿奖只会被纵向拉伸)// 设置autoresizesSubView让子类自动布局。headerImageView.autoresizesSubviews = YES;[self.mTableView addSubview:headerImageView];
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{return 50;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{static NSString *string = @"cell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:string];if (!cell) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:string];}cell.textLabel.text = [NSString stringWithFormat:@"========>%ld",(long)indexPath.row];return cell;
}- (void)scrollViewDidScroll:(UIScrollView *)scrollView{/***  处理头部图片拉伸放大效果*/CGFloat y = scrollView.contentOffset.y + 64;if (y < -headerImageHeight) {CGRect rect = headerImageView.frame;rect.origin.y = y;rect.size.height =  - y;headerImageView.frame = rect;}/***  处理Navigationbar 背景图片渐变效果*/UIColor *color = [UIColor colorWithRed:0.5 green:0.5 blue:1 alpha:1];CGFloat offsetY = scrollView.contentOffset.y + headerImageHeight;// Y轴大于0 设置navigationbar的透明度if (offsetY >0) {CGFloat alpha = MIN(1, offsetY/(headerImageHeight - 64));[self.navigationController.navigationBar cnSetBackgroundColor:[color colorWithAlphaComponent:alpha]];[self setNavigationColor:offsetY];} else {[self.navigationController.navigationBar cnSetBackgroundColor:[color colorWithAlphaComponent:0]];[self setNavigationColor:offsetY];}
}#pragma mark 重写状态栏的方法
/**为了适配IOS9 需要在 .pList文件里添加View controller-based status bar appearance 设置为 NO  默认为 YES*/
- (void)setNavigationColor:(CGFloat)floatY{if (floatY >= 180) {//状态栏˝˝[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];//标题颜色self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor whiteColor]};//导航栏子控件颜色self.navigationController.navigationBar.tintColor = [UIColor whiteColor];}else{//状态栏[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];//标题颜色self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor blackColor]};//导航栏子控件颜色self.navigationController.navigationBar.tintColor = [UIColor blackColor];}
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}

注意:当离开界面需要把TableView的代理方法取消掉 ,因为如果不取消掉的话 离开界面后还是会调用一次 scrollViewDidScroll 方法。


Demo 地址:https://github.com/xiangxianxiao/XXNavigationBarColor













这篇关于导航栏渐变透明下拉image放大的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011395

相关文章

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

PNG透明背景按钮的实现(MFC)

问题描述: 当前要在对话框上添加一个以两个PNG图片作为背景的按钮,PNG图的背景是透明的,按钮也要做出相同的透明效果。并且鼠标不在按钮上时,按钮显示"bg1.png";鼠标移动到按钮上时,按钮显示"bg2.png" 开发环境为VS2010。 解决办法: 使用GDI+库装载PNG图片,并使用MFC Button Control和CMFCButton类结合,调用CMFCButton

渐变颜色填充

GradientFill函数可以对特定的矩形区域或者三角形区域进行渐变颜色的填充。我们先来看看GradientFill函数到底长得什么样子,帅不帅。 [cpp]  view plain copy print ? BOOL GradientFill(     _In_  HDC hdc,     _In_  PTRIVERTEX pVertex,     _In_  ULONG

AF透明模式/虚拟网线模式组网部署

透明模式组网 实验拓扑  防火墙基本配置 接口配置 eth1  eth3   放通策略  1. 内网用户上班时间(9:00-17:00)不允许看视频、玩游戏及网上购物,其余时 间访问互联网不受限制;(20 分) 应用控制策略   2. 互联网用户只允许访问内网两台服务器的 WEB、SSH 和远程桌面服务,其余 服务均不允许访问;(20 分) 外网访问内网的限制策略   虚拟网线模式组网 实

Matplotlib图像读取和输出及jpg、png格式对比,及透明通道alpha设置

图像像素值 图像像素值一般size为3,也就是通道数,分别代表R,G,B,如果只有单一 一个值则表示灰度值,也就是说一张二维图片,当长和宽都为1080时,那么若是灰度图像,图像尺寸为(1080,1080,1)若是RGB图像则为(1080,1080,3), jpg、png图像格式 jpg图像的灰度值范围和RGB范围为[0,255],数值类型为uint8,也就是无符号整数 png图像的灰度值范

C#中的各种画刷, PathGradientBrush、线性渐变(LinearGradientBrush)和径向渐变的区别

在C#中,画刷(Brush)是用来填充图形(如形状或文本)内部区域的对象。在.NET框架中,画刷是System.Drawing命名空间的一部分,通常用于GDI+绘图操作。以下是一些常用的画刷类型: SolidBrush:用于创建单色填充的画刷。HatchBrush:用于创建具有图案填充的画刷。TextureBrush:用于创建具有图像纹理填充的画刷。LinearGradientBrush:用于创

Matlab中BaseZoom()函数实现曲线和图片的局部放大

BaseZoom工具下载链接: 链接:https://pan.baidu.com/s/1yItVSinh6vU4ImlbZW6Deg?pwd=9dyl 提取码:9dyl 下载完之后将工具包放置合适的路径下,并在matlab中“设置路径”中添加相应的路径; 注:可以先运行如下图片中的语句,看看是否报错;如果报如下错误,说明matlab未安装“Image Processing Toolbox”工

Oracle高级压缩和透明数据加密组合实验

本文参考了实验DB Security - Advanced Compression with Transparent Data Encryption(TDE),其申请地址在这里。 本文只使用了实验中关于高级压缩和在线重定义的部分。并对要点进行说明及对实验进行了简化。 准备:环境设置 原文中的实验环境实际上是改自Oracle示例Sample Schema,其实唯一的改动就是去掉了SALES表中