Menu

TableView顶视图放大,仿iOS手提式无线电话机QQ空间的领航样式



github

iOS手提式有线电话机QQ空间导航样式是,步向分界面时,未有导航栏,随着分界面包车型地铁滑行,滑动到自然地点的时候,会产出导航条,并且,开关的岗位不改变,一向在分界面包车型地铁最上端。

现行反革命app商业类型中手势全屏重临十一分最主要,互连网的兑现方式有诸多种,你把demo里面包车型客车UINavigationController+GestureBack那几个文件放到你的连串中,那么些意义就落到实处了,不用你加任何代码.效果图如下

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

图片 1顶端放大+全屏重临.gif


基本完结思路正是用运营时的章程调换拦截种类的pushViewController方法,替换来自定义的jd_pushViewController方法,为系统扩充叁个自定义的UIPanGestureRecognizer手势,系统从右侧滑动就有再次回到作用,大家用全屏手势也执行这么些系列方法.方法调换写在+
load
{}方法里面,在类被加载到运营时的时候,就能实践,用运营时替换系统的手势方法,把那么些分类放到项目里就兑现了全屏重临成效.

<一>、tableView上参与该样式

  • jd_pushViewController:(UIViewController *)viewController
    animated:animated {if
    (![self.interactivePopGestureRecognizer.view.gestureRecognizers
    containsObject:self.jd_popGestureRecognizer])
    {[self.interactivePopGestureRecognizer.view
    addGestureRecognizer:self.jd_popGestureRecognizer];

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

 NSArray *targets = [self.interactivePopGestureRecognizer valueForKey:@"targets"]; id internalTarget = [targets.firstObject valueForKey:@"target"]; SEL internalAction = NSSelectorFromString(@"handleNavigationTransition:"); //在代理里面规定手势效果什么时候可以用 self.jd_popGestureRecognizer.delegate = [self fullScreenPopGestureRecognizerDelegate]; //系统从左侧滑动就有返回功能,我们用全屏手势也执行这个系统方法 [self.jd_popGestureRecognizer addTarget:internalTarget action:internalAction]; // 禁用系统的交互手势 self.interactivePopGestureRecognizer.enabled = NO;}if (![self.viewControllers containsObject:viewController]) { [self jd_pushViewController:viewController animated:animated];}}

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

咱俩树立贰个ViewController,在最上端加多个View+ImageView,上面放TableView

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

  • 首先大家要隐敝导航栏,导航栏遮蔽时候要在viewWillAppear里面设置,要极小概会招致导航栏错乱.顶上部分图片和tableView会有贰个空荡荡中度,因为ViewController +
    NAV 会自动调解 tableView 的 contentInset .要用
    self.automaticallyAdjustsScrollViewInsets = NO;禁止使用自行调解 .

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

图片 2荧屏快速照相二零一六-10-27 16.32.41.png

self.navigationBgView=view;

  • 在左右滑动时候scrollViewDidScroll
    那些代理方法里面判别滑动的轻重,进而实时退换顶视图中度和调节地方,以及更换图片的晶莹度.

}

scrollViewDidScroll:(UIScrollView*)scrollView{// offset < 0
往下滑动 >0往上海好笑剧团动CGFloat offset = scrollView.contentOffset.y +
scrollView.contentInset.top;

self.navigationBgView.hidden=YES;

// 放大 往下滑动if (offset <= 0) { // 调整 headView 顶部置顶 高度变大 _headerView.y = 0; _headerView.heightS = kHeaderHeight - offset; _headerImageView.alpha = 1;}else { // 整体移动 网上滑动 变小 _headerView.heightS = kHeaderHeight; // headerView 最小 y 值 让移动到剩64时候不能往上移动 CGFloat min = kHeaderHeight - 64; _headerView.y = -MIN(min, offset); // 设置透明度 // 根据输出可以知道 offset / min == 1 时候为上移剩余64时 CGFloat progress = 1 - (offset / min); _headerImageView.alpha = progress; // 根据透明度,来修改状态栏的颜色 <0.5时候往上移动 _statusBarStyle = (progress < 0.5) ? UIStatusBarStyleDefault : UIStatusBarStyleLightContent; // 主动更新状态栏 [self.navigationController setNeedsStatusBarAppearanceUpdate];}// 设置图像高度_headerImageView.heightS = _headerView.heightS;// 设置分隔线的位置_lineView.y = _headerView.heightS - _lineView.heightS;

3、设置tableView,tableView的坐标供给小心下,区别的系统,暗中同意的坐标起先地点不一致,需已显示器最左上角为原点。还索要注意,要求安装下tableView的tableHeaderView,heardView必要与topView的尺寸同等,占住topView呈现的坑,那样不会让topView挡住tableView。

}

4、设置好topView,即步入分界面时供给呈现的头顶view。

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

-(void)scrollViewDidScroll:(UIScrollView *)scrollView

{

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

[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的装置格局一致。

标签:,

发表评论

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

相关文章

网站地图xml地图