iOS开发上下滑动UIScrollview隐藏或者显示导航栏,的渐变透明效果

澳门网上正规赌场网址 1自家是第一张图澳门网上正规赌场网址 2自小编是第二张图

iOS手提式有线电话机QQ空间导航样式是,步入界面时,未有导航栏,随着分界面包车型大巴滑行,滑动到早晚地方的时候,会产出导航条,并且,按键的岗位不改变,平昔在分界面包车型客车顶端。

非常多App都有前后滑动UIScrollview遮蔽只怕展现导航栏,在此处自个儿说说自身以为可行的三种办法:

看似这样的二个分界面,要兑现视图向上海好笑剧团动的时候导航栏渐变为透明而且收起来的成效,其实相当的粗略,首先这几个分界面是由UICollectionView来创设的,而UICollectionView其实是承继自UIScrollView,既然如此,我们得以在此时此刻调节器中遵守UIScrollViewDelegate公约,并且达成合同格局-
scrollViewDidScroll;

也正是要导航的背景在踏入分界面包车型地铁时候掩盖,滑动到早晚地方的时候,导航的背景出现,下拉的时候,底部视图跟着放大

1.iOS8以往系统有贰性情情hidesBarsOnSwipe

Objective-C代码如下

self.navigationController.hidesBarsOnSwipe=YES;

swift代码如下

self.navigationController?.hidesBarsOnSwipe=true

当使用上述代码时,能够达到规定的标准效果

以此办法是 UIScrollViewDelegate
中多少个相当的重大的格局,他会在视图滑动的时候动态调用,在此方法中打字与印刷scrollView.contentoffset.y


2.用到UIScrollViewDelegate三个代理方法

Objective-C代码如下

– (void)scrollViewDidScroll:(UIScrollView*)scrollView

{

//scrollView已经有拖拽手势,直接获得scrollView的拖拽手势

UIPanGestureRecognizer*pan = scrollView.panGestureRecognizer;

//获取到拖拽的速度 >0 向下拖动 <0 向上拖动

CGFloat velocity = [panvelocityInView:scrollView].y;

if(velocity <-5) {

//向上拖动,遮掩导航栏

[self.navigationControllersetNavigationBarHidden:YESanimated:YES];

}elseif(velocity >5) {

//向下拖动,呈现导航栏

[self.navigationControllersetNavigationBarHidden:NOanimated:YES];

}elseif(velocity ==0){

//停止拖拽

}

}

swift代码如下

func scrollViewDidScroll(scrollView: UIScrollView) {

let pan = scrollView.panGestureRecognizer

let velocity = pan.velocityInView(scrollView).y

ifvelocity < -5{

self.navigationController?.setNavigationBarHidden(true,animated:true)

}elseifvelocity >5{

self.navigationController?.setNavigationBarHidden(false,animated:true)

}

}

这种意义最棒

澳门网上正规赌场网址 3自家是第三张图

<一>、tableView上加入该样式

3.施用UIScrollViewDelegate另一个代理方法

Objective-C代码如下

– (void)scrollViewWillEndDragging:(UIScrollView*)scrollViewwithVelocity:(CGPoint)velocitytargetContentOffset:(inoutCGPoint*)targetContentOffset

{

if(velocity.y>0.0) {

[self.navigationControllersetNavigationBarHidden:YESanimated:YES];

}elseif(velocity.y<0.0){

[self.navigationControllersetNavigationBarHidden:NOanimated:YES];

}

}

swift代码如下

func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocityvelocity: CGPoint,targetContentOffset: UnsafeMutablePointer) {

ifvelocity.y>0{

self.navigationController?.setNavigationBarHidden(true,animated:true)

}elseifvelocity.y<0{

self.navigationController?.setNavigationBarHidden(false,animated:true)

}

}


如上内容转发:

此刻您会发觉怎么会有负数输出呢,这是因为UICollectionView控件的bounds的y是从标题栏的底下起首算起的(当然你也足以安装他的
y
值得原点正是漫天视图的原点,在此间先不说).当你向上海滑稽剧团动的时候UICollectionView的Y值就能够发展递减,当Y值为64的时候到达显示屏顶点.

1、设置好导航的标题、左左边开关

正好大家得以行使那个 y 值来安装标题栏的 阿尔法 值,代码如下:

2、在viewDidLoad中得到self.navigationController.navigationBar.subviews中的_UINavigationBarBackground,并设置为透明,那样就能够在刚进去界面的时候未有显示导航的背景象

– scrollViewDidScroll:(UIScrollView *)scrollView{

for (UIView *view in self.navigationController.navigationBar.subviews)
{

CGFloat offset = scrollView.contentOffset.y;

if([view
isKindOfClass:NSClassFromString(@”_UINavigationBarBackground”)])

NSLog(@”%f”,offset);

self.navigationBgView=view;

if (offset < 0) {

}

self.tabBarController.navigationController.hidesBarsOnSwipe = YES;

self.navigationBgView.hidden=YES;

self.tabBarController.navigationController.navigationBar.alpha = fabs/64
*澳门网上正规赌场网址,1.0;

3、设置tableView,tableView的坐标须要注意下,分裂的系统,私下认可的坐标伊始地方差别,需已显示器最左上角为原点。还索要小心,要求安装下tableView的tableHeaderView,heardView供给与topView的轻重同等,占住topView呈现的坑,那样不会让topView挡住tableView。

}

4、设置好topView,即步向分界面时须要体现的头顶view。

else{

5、由于UITableView是接二连三与UIScrollView,所以当tableView滑动时会触发scrollViewDidScroll方法,在scrollViewDidScroll方法中,根据坐标设置好self.navigationBgView的产出与掩盖,以及安装好topView依照拉伸的力度设置好topView的frame。

self.tabBarController.navigationController.navigationBar.alpha = 0.0;

-(void)scrollViewDidScroll:(UIScrollView *)scrollView

}

{

}

if (scrollView.contentOffset.y<self.topView.frame.size.height-64-64)
{

假设要设置标题栏自动接到的话,直接设置navigationController.hidesBarsOnSwipe
= YES就行了.

[UIView animateWithDuration:0.2 animations:^{

self.bgView.hidden=YES;

}];

}

else{

[UIView animateWithDuration:0.2 animations:^{

self.bgView.hidden=NO;

}];

}

CGRect f    = self.topView.frame;

f.size.width = self.backTableView.frame.size.width;

self.topView.frame  = f;

if (scrollView.contentOffset.y<-64) {

CGFloat offset = (scrollView.contentOffset.y +
scrollView.contentInset.top) * -1;

CGRect initFrame;

initFrame.origin.x=- offset /2;

initFrame.origin.y=- offset;

initFrame.size.width=self.backTableView.frame.size.width+offset;

initFrame.size.height=200+offset;

self.topView.frame=initFrame;

}


<二>scrollView设置该样式

1、设置好导航的标题、左侧面开关

2、在viewDidLoad中得到self.navigationController.navigationBar.subviews中的_UINavigationBarBackground,并安装为透明,这样就能够在刚步入分界面的时候从不显得导航的背景观

for (UIView *view in self.navigationController.navigationBar.subviews)
{

if([view
isKindOfClass:NSClassFromString(@”_UINavigationBarBackground”)])

self.navigationBgView=view;

}

self.navigationBgView.hidden=YES;

3、设置好UIScrollView,UIScrollView的坐标需求小心下,不一样的系统,私下认可的坐标开头地方不一样,需已显示屏最左上角为原点。scrollView的底下的布局要求注意一下坐标难点。

4、设置好topView,即步向分界面时供给展示的头顶view。

5、在scrollViewDidScroll方法中总结好self.navigationBgView的遮掩与产出,以及安装好topView遵照拉伸的力度设置好topView的frame。

-(void)scrollViewDidScroll:(UIScrollView *)scrollView

{

if (scrollView.contentOffset.y<topView.frame.size.height-64-64) {

[UIView animateWithDuration:0.2 animations:^{

bgView.hidden=YES;

}];

}

else{

[UIView animateWithDuration:0.2 animations:^{

bgView.hidden=NO;

}];

}

CGRect f    = topView.frame;

f.size.width = scroll.frame.size.width;

topView.frame  = f;

if (scrollView.contentOffset.y<-64) {

CGFloat offset = (scrollView.contentOffset.y +
scrollView.contentInset.top) * -1;

CGRect initFrame;

initFrame.origin.x=- offset /2;

initFrame.origin.y=- offset;

initFrame.size.width=scroll.frame.size.width+offset;

initFrame.size.height=200+offset;

topView.frame=initFrame;

}

}

scrollView的安装形式大致与tableView的安装形式同样。

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注