美文网首页iOS 开发学习成长之路UIKitios
iOS 关于navigationBar的一些:毛玻璃、透明、动态

iOS 关于navigationBar的一些:毛玻璃、透明、动态

作者: 霖溦 | 来源:发表于2016-03-22 02:07 被阅读36840次

    前言

    本文整理了一些关于navigationBar的非常规的但是较为实用的操作,包括利用毛玻璃、动态透明、动态item颜色、动态隐藏,以及头视图的动态缩放,并同时涉及了statusBar的动态设置(换色)。
    先预览下整体效果:


    Demo详见GitHub:Demo_AboutNavigationBar
    为了便于展示,类没有复用,也没有继承共有的父类,所有存在大量“有丝分裂”的重复代码。。。说白了就是懒。。。千万别学我就是了。

    1.不要“浪费”了这块毛玻璃

    这里所谓的不要浪费,只是个人的偏好,当然也是顺遂了苹果的UI特色之一:毛玻璃穿透效果。
    一般界面上是有两块毛玻璃的:navigationBar和tabBar,很多APP都会自定义这两块Bar,不仅是颜色,甚至是控件本身。单考虑利用系统的Bar的话,如果不自定义颜色,就是利用毛玻璃效果本身了,然而很多APP,也并未利用起这个毛玻璃效果,简书的就是这样,不过简书应该是自定义了navigationBar?或许。
    (这里插一句,就是QQ的某次更新,更新之后,navigationBar的蓝色变成了毛玻璃,之后的一次更新又换了回来……可能是被吐槽太多?这里应该是用户习惯先入为主的问题了;还有就是微信,微信应该算得上是个十分纯粹的iOS风格的APP,有留意过的话,也会发现其navigationBar是黑色的毛玻璃,或许是barStyle = UIBarStyleBlack,因为微信也是有很多非原生的处理的。)
    下面结合tableView介绍下其与navigationBar的毛玻璃的作用效果。知道我可能要啰嗦什么的朋友可自行跳过这部分内容。
    先对比下这两种效果(图不太清晰,仔细看navigationBar,还是很容易对比出来差别的):

    有毛玻璃穿透效果的效果
    没有毛玻璃穿透效果

    1.1.一般的处理

      - (UITableView *)tableView
      {
          if (!_tableView) {
              _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, ScreenWidth, ScreenHeight - 64)];
              _tableView.delegate = self;
              _tableView.dataSource = self;
              _tableView.backgroundColor = [UIColor whiteColor];
              _tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
          }
          return _tableView;
      }
    

    相信有很多人大概是以与这样类似的方式去初始化tableView的,origin.y=64,总高度-64,都是为了防止navigationBar的遮挡,然而这样的处理会产生一个bug,就是tableView整体居然下移了64……,然后就有了这段解决代码:

      if ([self respondsToSelector:@selector(automaticallyAdjustsScrollViewInsets)]) {
          self.automaticallyAdjustsScrollViewInsets = NO;
      }
    

    这是iOS7的特性之一,navigationBar自适应scrollView滑动视图,然而因为我们的+64的处理,导致系统的这个默认开启的功能就成了自作多情。如果

    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight)];
    

    这样做,之前的“bug”自然就会没有,而且我们想要的毛玻璃效果就会自然的展现出来(如上图一),但是因为系统的自适应,在某些特殊情况下,依旧会产生不可控的bug,所以刚才处理bug的代码,还是有必要的。

    1.2.“释放”系统的毛玻璃效果的处理

    配合:

      if ([self respondsToSelector:@selector(automaticallyAdjustsScrollViewInsets)]) {
          self.automaticallyAdjustsScrollViewInsets = NO;
      }
    

    这样初始化tableView:
    - (UITableView *)tableView
    {
    if (!_tableView) {
    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight)];
    _tableView.delegate = self;
    _tableView.dataSource = self;
    _tableView.backgroundColor = [UIColor whiteColor];
    _tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
    _tableView.scrollIndicatorInsets = UIEdgeInsetsMake(64, 0, 0, 0);
    _tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
    }
    return _tableView;
    }
    这里利用了edgeInset内嵌边距,tableView的frame依旧是全屏尺寸的,只是设置了下contentInset使得其内容视图的尺寸改变了,scrollIndicatorInsets是右侧的滑动指示器,要跟着一起才自然。如果当前页还有tabBar的话,只需要设置UIEdgeInsetsMakebottom值就行。这样,上图一的毛玻璃穿透效果就自然的释放了出来。

    1.3.设置contentInset带来的小问题

    • 1.webView初始加载时底部的黑条
      如果使用上述方式初始化webView(同样是滑动视图,有scrollView属性,可设置scrollView.contentInset),至于所谓的“黑条”,大致类似于下面的效果:

      黑条出现在视图底部,一般高度为64,也就是contentInsettop值,上图的因为设置关系要大很多。相信很多人都在浏览APP的webView时,在web加载完之前的空白页时,见到过这一现象。
      关于这以现象的解决方法网上也有很多,我一般是在初始化时,将contentOffset.y设置一个(-64)的偏移量,这样,初始进入webView时,在不滑动页面的情况下,是不可见的,这算是较为温和的解决方法吧,还有一种就是,初始化时设置opaque=NO,也就是使得view透明,但是在加载之后,要设置opaque=YES,也就是默认不透明,这样,黑条是彻底不可见的。
    • 2.滑动偏移量改变
      在实现一些滑动视图的动态变化的处理中,例如稍后提到的动态缩放,一般会用代理检测contentOffset.y值,但是因为设置了contentInset.top,此时contentOffset.y值也就发生了变化:
      - (void)scrollViewDidScroll:(UIScrollView *)scrollView
      {
      CGFloat offsetY = scrollView.contentOffset.y + self.tableView.contentInset.top;//注意
      }
      初始不再是0,而是-64,也就是-top

    1.4.为什么需要毛玻璃效果

    费了一些功夫,都只是为了实现毛玻璃效果,至于为什么要这个毛玻璃穿透效果,我也说不好,喜好也罢,设计风格也罢,至少,感觉这样做出的APP,不用专门考虑各种Bar的配色什么的,动态模糊穿透的彩色,也的确很漂亮,至少,iOS的UI风格有这样的趋势。也不要小瞧这个毛玻璃效果,真正实现一个高效的毛玻璃,也就是动态模糊渲染,也是很麻烦的,一些三方库,为了版本适配(适配iOS7),自定义的毛玻璃,也是利用了系统的toolBar。看过一些文章,介绍来介绍去,还是说,用系统在iOS8之后提供的API实现毛玻璃是最好的方式。
    下图(渣图……)是我最近封装了有一阵子的一个自定义控件,同样是为了效果,用toolBar自定义了一块毛玻璃,这个控件还未彻底完善,稍后会开源,下图只是其中一种样式,这个控件的自定义程度还是非常高的。


    2.navigationBar的透明

    有时候,我们需要将navigationBar设置透明,但不是隐藏,因为还需要其item控件(返回键什么的),虽然navigationBar是继承于UIView的,但是直接设置其alpha是无效的,应该是因为navigationBar复合的视图层级:



    根据视图层级关系,我们用这个十分简单的方法来设置navigationBar的透明:
    [[[self.navigationController.navigationBar subviews] objectAtIndex:0] setAlpha:0];
    

    关于navigationBar设置透明的方法,不知上述一种,还有许多,详见此文,非常具有参考价值:

    怎么把顶部这个navigationbar设置为透明呢,能够让下面的图片显示出来,但是返回按钮不透明?

    如果想像QQ空间或者微博那样动态的改变透明度,只需要在scrollViewDidScroll方法中,动态去设置alpha值就行,何时开始改变、变化率全凭自定义的参数控制,具体详见Demo中的代码。

    3.动态statusBar颜色

    改变item的颜色很简单,只需设置:

    self.navigationController.navigationBar.tintColor = [UIColor blackColor];
    

    动态设置的方式同刚才的alpha。这里主要说的是statusBar的颜色或者说样式的改变。
    iOS7之后,statusBar不再是全局属性,每个VC都可自行控制statusBar的样式,虽然样式只有简单的字体黑或白两种,但是在很多情况下都是很有用的,尤其是上面的navigationBar的alpha动态改变,在QQ空间中就有这个效果。
    在设置statusBar样式之前,需要做一个处理,而且是针对navigationBar的处理,在使用了navigationController之后,直接设置某一个VC的statusBar的样式是无效的,因为navigationBar是唯一的,所有压栈推出的VC,都是navigationController的子控制器,这就需要指定statusBar样式改变的VC为当前的topVC,具体方式网上也有很多,这里只介绍个人使用的一种。
    首先创建一个继承于UINavigationController的子类,在这个类中实现下面的方法:
    - (UIViewController *)childViewControllerForStatusBarStyle
    {
    return self.topViewController;
    }
    或者是同样效果的这个方法:
    - (UIStatusBarStyle)preferredStatusBarStyle
    {
    UIViewController * topVC = self.topViewController;
    return [topVC preferredStatusBarStyle];
    }

    之后,只需在要改变statusBar样式的VC类中实现:
    #ifdef __IPHONE_7_0
    - (UIStatusBarStyle)preferredStatusBarStyle
    {
    if (_statusBarStyleControl) {
    return UIStatusBarStyleDefault;
    }
    else {
    return UIStatusBarStyleLightContent;
    }
    }
    - (BOOL)prefersStatusBarHidden
    {
    return NO;
    }
    #endif

    __IPHONE_7_0是系统的宏,这里用来版本适配,这个不写貌似没有关系?因为之前试了iOS7以下的系统没有崩溃,iOS7之前没有这个方法,应该是不会执行的,也就不会崩溃。
    preferredStatusBarStyle就是控制用来控制statusBar颜色或者说样式的,_statusBarStyleControl是自定义的一个用来动态控制的BOOL属性。
    prefersStatusBarHidden这个控制statusBar的显示隐藏,建议NO或直接默认不写,如果设置隐藏,视图会整体上移20,效果不太好,看具体需求。

    至于控制statusBar的改变,也是在scrollViewDidScroll代理中动态实现,例如某一情况下触发如下:

    _statusBarStyleControl = YES;
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
        [self setNeedsStatusBarAppearanceUpdate];
    }
    

    第一步是设置之前提到的_statusBarStyleControl标志位的值的切换,第二部是最重要的setNeedsStatusBarAppearanceUpdate,这个系统的方法是在改变statusBar显示样式之前必须执行的,否则preferredStatusBarStyle不会再当前视图加载完成后再次执行。

    4.navigationBar的动态隐藏

    navigationBar的隐藏很简单:

    [self.navigationController setNavigationBarHidden:YES animated:YES];
    

    这个方法可以使动态隐藏时有动画效果,不会显得突兀。
    动态隐藏的效果有两个场景:一个就是例如简书这样的,在浏览时,上滑,navigationBar隐藏,下滑navigationBar显示,在这期间,手指是不松开的,这需要实时检测当前是上滑还是下滑;第二个场景是Safari浏览器那样的,滑动后松手,根据上滑还是下滑设置隐藏(Safari的navigationBar不是隐藏,只是变化)。这样的两种场景虽然很相似,但就是松不松手的问题,处理方式和体验也是完全不同的。

    • 1.第二场景,松手
      这个处理十分简单:
      - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
      NSLog(@"======== %lf", velocity.y);
      if(velocity.y > 0) {
      [self.navigationController setNavigationBarHidden:YES animated:YES];
      }
      else {
      [self.navigationController setNavigationBarHidden:NO animated:YES];
      }
      }
      velocity.y这个量,在上滑和下滑时,变化极小(小数),但是因为方向不同,有正负之分,这就很好处理了。

    • 2.第一场景,不松手
      - (void)scrollViewDidScroll:(UIScrollView *)scrollView
      {
      CGFloat offsetY = scrollView.contentOffset.y + _tableView.contentInset.top;//注意
      CGFloat panTranslationY = [scrollView.panGestureRecognizer translationInView:self.tableView].y;

          if (offsetY > 64) {
              if (panTranslationY > 0) { //下滑趋势,显示
                  [self.navigationController setNavigationBarHidden:NO animated:YES];
              }
              else {  //上滑趋势,隐藏
                  [self.navigationController setNavigationBarHidden:YES animated:YES];
              }
          }
          else {
              [self.navigationController setNavigationBarHidden:NO animated:YES];
          }
      }
      

    这里的offsetY > 64只是为了在视图滑过navigationBar的高度之后才开始处理,防止影响展示效果。
    panTranslationY是scrollView的pan手势的手指位置的y值,这个方法是个人自己想到的,可能不是太好,因为panTranslationY这个值在较小幅度上下滑动时,可能都为正或都为负,这就使得这一方式不太灵敏,如果有更好的方法,欢迎留言交流。

    5.动态缩放

    这个效果纯粹是为了仿简书的个人信息的头像的缩放效果。
    头像视图的布局直接利用了navigationBar的titleView,代码还是很好理解的,视图层级关系如下:



    头像的一半是“悬空”的。
    缩放只是滑动代理监听时的一个动态缩放的过程,缩放率同之前说的alpha的动态变化一样,自行设置常量,这里注意缩放过程的分段执行,为了效果,这个有下拉放大回弹的效果,这部分不是简书的效果:

    _topImageView.transform = CGAffineTransformMakeScale(1 - offsetY/300, 1 - offsetY/300);
    

    如果只是设置缩放,效果如下:



    为了使缩放过程中位置相对保持,之前想到了改变锚点的方式,然而效果很差,最终还是以简单的方式实现:

    CGRect frame = _topImageView.frame;
    frame.origin.y = 5;
    _topImageView.frame = frame;
    

    就是保持y的坐标为初始值。
    下面的这个仿微博的效果,也是基于同样的原理,只是要注意图层关系,详细参考代码,不再赘述。


    6.侧滑返回

    这算是个比较大的话题了,前面提到的那篇文章中有关于此的详细论述,这里只是简单提及,稍后有机会,会专门写一篇关于侧滑返回的自定义实现。
    iOS7之后,navigationController推出的视图,只要返回按钮不自定义覆盖,或者相关属性默认,右滑屏幕左边缘,可以直接pop返回,这是个十分方便的功能。关于实现和自定义实现,网上也有太多的文章。这里只是说明一点,就是在设置navigationBar透明之后,使用侧滑返回的过程中,navigationBar会突然出现,显得十分突兀,这也是目前微博APP的效果,QQ和微信都针对此做了不同的处理,本文的Demo中也尝试做了一定的处理,但是效果并不是十分理想的,就是中断侧滑返回动作时,navigationBar闪的问题。这个问题已经超出本文内容的范围,有机会会在今后的文章中介绍。


    参考文章:
    1.iOS开发的一些奇巧淫技
    2.自定义iOS7导航栏背景,标题和返回按钮文字颜色
    3.Removing the title text of an iOS 7 UIBarButtonItem
    4.iOS 实现ScrollView 上滑隐藏Navigationbar,下滑显示
    5.iOS 7 改变 app 的外观(NavigationBar,TabBar,StatusBar)
    6.iOS不同版本适配问题(#ifdef __IPHONE_7_0)
    7. __IPHONE_OS_VERSION_MIN_REQUIRED
    8.IOS开发之不同版本适配问题3(#ifdef __IPHONE_7_0 BaseSDK Development Target)
    9.IOS开发之不同版本适配问题2(#ifdef __IPHONE_7_0)
    10.ios7 statusBar的字体颜色怎么设置为白色的呢
    11.IOS上 关于状态栏的相关设置(UIStatusBar)
    12.IOS7怎么修改Navigation Bar上的返回按钮文本颜色,箭头颜色以及导航栏按钮的颜色
    13.怎么把顶部这个navigationbar设置为透明呢,能够让下面的图片显示出来,但是返回按钮不透明?
    14.iOS navigationbar全透明的方法
    15.IOS中设置UINavigationBar的各种样式(图片/透明效果/下方内容显示情况)
    16.iOS开发UI篇—CAlayer层的属性
    17.iOS - UINavigationController简介

    ·转载请声明出处·

    相关文章

      网友评论

      • 谢谢生活:push返回的时候titleView 图片只显示一半。
      • BohrIsLay:新闻这个毛玻璃效果有demo吗?导航栏的容易,导航栏下面还有一部分视图,没有思路,有demo吗
        BohrIsLay:@霖溦 谢谢,我后来自己琢磨着实现了这个效果:smiley:
        霖溦:@BohrIsLay 暂时没开源,就是个毛玻璃视图
      • hiseason:你好, 请教一下,我设置 [[[self.navigationController.navigationBar subviews] objectAtIndex:0] setAlpha:0]; 无效, 请问知道是什么原因吗。我设置了透明度 self.navigationController.navigationBar.translucent = YES; 也不行
        任梦RM:iOS 11 上头像超出导航栏的部分会被截掉?怎么回事
        能量达人儿:可以试试这样
        ```
        if (@available(iOS 11.0, *)) {
        [self.navigationController.navigationBar setTranslucent:NO];
        [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
        [self.navigationController.navigationBar setShadowImage:nil];
        [[[self.navigationController.navigationBar subviews] objectAtIndex:0] setAlpha:1];
        } else {
        [[[self.navigationController.navigationBar subviews] objectAtIndex:0] setAlpha:1];
        }
        ```
        霖溦:@hiseason 这篇文章比较旧了,新系统没有适配,可能有不一样吧
      • A_rcher34:您好,请问我想实现让导航栏变成白色,且具有毛玻璃效果,应该怎么修改呢?系统的毛玻璃不是白色
        霖溦:@A_rcher34 用toolbar的毛玻璃试试吧,不行用yykit里的那个自定义
        A_rcher34:@霖溦 系统的不是纯白色的,感觉像是有点灰白,想要实现那种和iOS11里,系统新加的那个文件应用里,那样的 导航栏的效果,白色,且有毛玻璃:pray:
        霖溦:@A_rcher34 不懂,系统的不就是白色?
      • 沙暴送葬:设置本地图片是好的,但网图就变色了,这是怎么回事
      • 丐帮头:你好,问下就是头像放大之后,超出navbar,push到下一个页面,再pop回来,超出部分会先消失然后再显示,显得特别突兀,有什么好的方式解决这个问题吗?
        霖溦:@丐帮头 如果是首页,bar是透明的话,没必要加在bar上了,就像微博那样,如果不是,还需要显示的话,不在转场动画中隐藏,只能自定义bar和转场动画了,系统的之所以那样,貌似是过渡时“截图”操作?不是太清楚,总之超出的部分,过渡时显示不了。
        丐帮头:@霖溦 我并不想隐藏,我就是要显示出来,我这个是首页,如果隐藏就不好了
        霖溦:@丐帮头 可以参考简书的做法,监听返回事件,提前隐藏
      • earthX:写的不错~
      • brownfeng:非常棒!!
      • CoffeeKid:作者你好,不知道你有没有遇到过一个问题,分别在viewWillAppear和viewWillDisappear中调用setNavigationBarHidden方法,animated参数为true,按返回键的时候一切看起来很美好。但如果使用手势,快速向右再向左,并没有完成pop,navigationBar却隐藏了。如果animated参数设为false则没有这个问题,但过度效果没有true好看。
        霖溦:@馒头小子 不清楚,搞不好苹果直接不予理睬,本来这就是特殊操作,纯自定义比较靠谱
        CoffeeKid:@霖溦 原来是这样,那挺蛋疼的,我现在把从有切换到无(不知道这样表达能不能看懂)的那个页面的返回手势先禁用掉,看看以后会不会修复这个问题,缓兵之计。
        霖溦:对,是这样的,你可以看下iOS10之后的系统联系人,点击头像,再像你说的那样操作,也会有同样的问题,还有许多app也是这样的,原因不明,所以,普遍的做法是,彻底自定义。。。
      • 语安月月鸟:涨知识了!
      • e321b2c2a7e0:很有用
      • 施瓦新格格:细致入微!
      • WellCheng:> 这是iOS7的特性之一,navigationBar自适应scrollView滑动视图,然而因为我们的+64的处理,导致系统的这个默认开启的功能就成了自作多情。

        这里更正下,只有当 viewController 检测到,当前View 的第一个 subView 是 scrollView 的时候,才会自动下移 64。

        这个应该算是一个坑,Apple 的官方 WatchOS App 都踩到了

        WellCheng:@WellCheng 可以hack下,添加一个空白的subview
        霖溦:@WellCheng 嗯,是的,一般都是直接加table,很容易遇到,索性直接关掉了。
      • 没有黑眼圈de熊猫:[[[self.navigationController.navigationBar subviews] objectAtIndex:0] setAlpha:0];使用这个方法push到下个页面的话,下个页面的导航栏也是透明的,在viewWillAppear里面设置为不透明也没有用,这是怎么回事呢
      • leftwater:写的很好 赞一个 参考资料都注明了
      • 一缕殇流化隐半边冰霜:大神,请教你一个问题呀。我看了你的Demo了,都是正确的,不过我按照你的例子,写到我们工程里,push到第二个界面,第二个界面的tableview没法全屏,大小还是从64下面开始的,也就是self.view是从navigationBar下面开始的:sweat::sweat:想问问大神,我是哪里出问题了?和你例子有一个不同的是,我第一个界面是没有navigationBar的,push到第二个界面的时候,加了一个NavigationBar再push过去的。求大神指点。
        一缕殇流化隐半边冰霜:@霖溦 额。。。我也还是菜鸟啦。。。我第一个界面navi是隐藏的,view也是全屏显示的,push到第二个界面view就少了上面的64了。push是在同一个navigationController下同级进行的。系统自适应是你上面说的self.automaticallyAdjustsScrollViewInsets = NO,是吧?我也关了。。我和你代码没有区别了,唯一区别就是第一个界面隐藏了navi,但是我看你隐藏了navi好像也没事。我就郁闷了。。。求指点。。。
        霖溦:@一缕殇流化隐半边冰霜 PS:我不是大神,我看你才是:flushed:
        霖溦:@一缕殇流化隐半边冰霜 第一个页面是隐藏了吗?因为push都是在同一个navigationController下同级进行的。还有,是否关闭了系统的自适应。
      • hello_kity:学习了
      • 郑一一一一:感谢万分
      • brownfeng:非常棒.学习了.谢谢
      • e2f2d779c022:最后导航条闪烁的问题可以参考我的解决方案http://www.jianshu.com/p/88bc827f0692
        霖溦:@NewPan 好的,学习下
        e2f2d779c022:@霖溦 可以
        霖溦:@NewPan 可以做到侧滑返回中途取消的闪烁吗?我看支付宝还是不行,qq只是做了个缓冲动画
      • T_label:比较详细
      • __下一个天亮__:真心不错的文章 :+1:
      • leftwater:不错啊
      • vulgur:参考文章中居然看到了我的文章…… :smile:
        霖溦:@vulgur 哈哈,还是要感谢分享呢
      • 夜游er:请问下楼主1.4节那张gif图中的
        tableView上面的滚动条是自己写的还是用第三方库?
        如果是自己实现的能告诉下思路吗?
        谢谢!
        霖溦:@夜游er 那是我自己封的一个三方,涉及比较多,一直没时间完善,等忙完这阵子再弄,简单的思路就是scroll的代理配合动画。
      • CoderLWG:感谢,学习一下
      • JamesCaiLee:如果push一个新的一个新的界面(导航不透明),切换时动画很突兀,不知道有好的办法解决吗
        霖溦:@JamesCaiLee 嗯,这个文中有提到,用原生的不太容易处理,可以看下参考文章,较为容易的处理是颜色渐变或假bar
        JamesCaiLee:@霖溦 新界面的导航栏恢复成不透明,从前一个透明到后一个不透明的导航栏的动画很突兀
        霖溦:@JamesCaiLee 新界面的导航栏?换了颜色还是?
      • 无法触碰:感谢分享,以前都没怎么注意过毛玻璃效果
      • 82188ef3641d:感谢作者的文章,解决了我一个困扰很久的bug . 侧滑返回这一块也期待作者的更新
      • hony啊:哥们,能把demo分享出来吗?想研究一下tableview分页右边还有下拉item的东西
        霖溦:@import 仔细看,我的文章在开头基本都有贴demo的超链
      • 付寒宇:写得很好啊,一般不爱用系统的就因为好麻烦,自己写又不好用,侧滑尤其是个莫名其妙的问题,有时候手势jiu wu xiao le
        霖溦:@付寒宇 手势无效是因为自定义了返回按钮,还是有方法恢复的
      • Legend_Bear:感谢楼主的分享,请问 1 - offsetY/num1 = 0.45;
        0.45 为最终缩小倍率
        offsetY 为纵偏移量
        num1=300 为要计算的值
        150/165 就是滑动多少距离后,完成缩放
        你代码中这个num1=300 和 1 - offsetY/num1 = 0.45 是怎么得出来的,我自己做的时候 也有想过这种缩放率和公式 但是 没有头绪。。
        霖溦:@Legend_Bear 1-offsetY/num1为缩小后相对于原图的倍数,所以其结果就是缩小率,offsetY决定了完成缩放所需的滑动距离,所以其值越大,缩放的越慢,这里只是想求解,假如滑动165,完成缩放,那么动态缩放因数的num1就是根据上述公式求解的,放大因数同理,只是如果缩小0.45,那么此时求出的因数在放大时,最终会放大为1.55,可以算一下,这两个因数不能共用,除非缩放0.5,offsetY > 165的过程,只是为了保证放大过程终止,且大小稳定下来
      • 飞翔的小骑兵:毛玻璃,模拟器可以,真机不行。
        霖溦:@c1ear 什么意思?系统的吗?可以的
      • 华之曦:终于找到您的这篇文章,找了好久的,总结的非常棒,感谢关注,要不然还是一直处于平行状态。
        华之曦: @霖溦 谢谢,不过,总感觉我总结的有瑕疵。
        霖溦:@Huazhixi 配合你那篇就完整了😄
      • 林凌子文:非常感谢作者。一直对例子中的几种效果的实现很迷惑,并且不知道怎么入手解决就一直懵懂的状态,这篇文章一下子让我豁然开朗,收获颇多。期待作者其他的优秀文章。
        霖溦:@林凌子文 客气了,很高兴我的文字能帮到你,共勉。
      • 不是谢志伟:太全了,👍
      • roc_lei:给力
      • Dombo_Y:哦或,makr
      • MarkTang:很好,谢谢! :relaxed:
      • xxttw:超级棒
      • degulade:mark!
      • 说好买辣椒:不错,收藏一下
      • HenryCheng:这种效果一年前挺火的,现在倒是不常见了
        HenryCheng:@霖溦 恩是的,技术是不会过时的,哈哈
        霖溦:@HenryCheng 是指缩放?其实不是重点啦
      • 纪宝宝:实用
      • 1b96465a70bf:喜欢,支持
      • 法拉达:不错 顶
      • 无畏009:能否发下demo
        无畏009:@霖溦 好的,谢谢
        霖溦:@陈建蕾 demo链接在文章开头有的啊,是文字超链接,可以看下,我的文章一般都有demo
      • Cyandev:WebView 的问题解决了!
        霖溦:@Cyandev 哦,如果有更好的解决方式欢迎分享😂
        Cyandev:@霖溦 我是说按你的文章解决了我的问题:joy:
        霖溦:@Cyandev 请问你是怎么解决的呢?

      本文标题:iOS 关于navigationBar的一些:毛玻璃、透明、动态

      本文链接:https://www.haomeiwen.com/subject/erstlttx.html