在UIWindow上加类似于“回到顶部”的按钮

在公司上个版本的开发中遇到了一个UI布局的小问题:

某个页面需要增加一个分享按钮,但是该页面是二级页面,导航栏右边也已经放置了2个button。
起初和老大谈论这个问题的时候想到的方法是导航栏右边加三个button得了~但是一回想,这貌似太丑了!虽然两人都不是处女座,不过这个方法算是pass掉了
当天下班前想起浏览网页的时候经常会在滑动的时候右下方出现一个“回到顶部”的按钮,似乎在iOS客户端也可以实现这一类似的功能。

原理:获取到keywindow,然后在keywindow上面添加一个bgView,在bgView上面加上一个UIButton(之所以这样包装一层是为了美观一点,想将shareBtn弄成圆型)

    - (void)createShareBtn
    {
      UIButton *shareBtn = [UIButton buttonWithType:UIButtonTypeCustom];
      shareBtn.frame = CGRectMake(0, 0, 40, 40);
      [shareBtn setImage:[UIImage imageNamed:@"wright"] forState:UIControlStateNormal];
      [shareBtn addTarget:self action:@selector(shareBtnAction) forControlEvents:UIControlEventTouchUpInside];
   
      bgView = [[UIView alloc] initWithFrame:CGRectMake(kScreen_width-50, kScreen_height/2-64, 40, 40)];
      bgView.backgroundColor = [UIColor whiteColor];
      bgView.alpha = .9;
      bgView.layer.cornerRadius = 20;
      bgView.layer.masksToBounds = YES;
      [bgView addSubview:shareBtn];
    
      // 获取keyWindow
      UIWindow *keywindow = [UIApplication sharedApplication].keyWindow;
      [keywindow addSubview:bgView];
    }
    - (void)shareBtnAction
    {
      //创建分享视图
      [self shareView];
    }

有一点需要注意:即如果我们这样设置了,那么需要进行下一步操作(在视图pop的时候,移除shareBtn),否则shareBtn会一直显示在keywindow上面

    - (void)viewWillDisappear:(BOOL)animated
    {
      [super viewWillDisappear:animated];
      // 这里bgView是全局的
      [bgView removeFromSuperview];
    }

当然还有一点

细心的同学会发现我在bgView设置了alpha值为0.9,这样依然会遮挡住下面的视图,影响用户浏览

为此我做了如下设置:
1、值得说一下的是,整个二级页面的层级结构是
UIViewController-->webView
2、让我们来看看webView里有一些什么我们可以用到的:

@interface UIWebView : UIView <NSCoding, UIScrollViewDelegate> 
@property (nullable, nonatomic, assign) id <UIWebViewDelegate> delegate;
@property (nonatomic, readonly, strong) UIScrollView *scrollView NS_AVAILABLE_IOS(5_0);

对于UIScrollViewDelegate大家应该不陌生了

    #pragma mark - UIScrollViewDelegate
    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    {
      bgView.alpha = .45;
    }
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
    {
      bgView.alpha = .9;
    }

当然一定不要忘了签约:webView.scrollView.delegate = self;
对于- (void)createShareBtn方法的调用随大家需求所定

1、如果需要长期显示,可以在- (void)viewDidLoad方法里调用(此处还有一个小技巧:createShareBtn在createWebView之后😄)
2、如果只是在滑动时显示,可以在UIScrollViewDelegate的代理方法里调用

希望能帮助大家(ps:为什么不直接加在webView上呢?博主前段时候在群里看到小伙伴讨论keywindow,然后心血来潮想试试keywindow而已😂)
暂贴一张手机录的GIF图~


当然说一个与本文无关的,关于UIWindow的题外话:

不要滥用UIWindow!不要滥用!不滥用!(重要的事说三遍😂)

通过创建UIWindow,我们很容易地实现了将某个特定界面置于最上层的效果,但是这种特性不应该被滥用。很多时候,如果弹出界面明显属于某一个ViewController,那么更适合把弹出的界面当做这个ViewController的view的subView来实现。
常见的滥用方式是把需要的弹出界面都设置成单例,需要的时候就调用显示。这种做法会使得新创建的UIWindow一直得不到释放。并且当出现多个UIWindow需要相互有层级覆盖关系时,实现起来比较复杂。
---《iOS开发进阶》


posted @ 2018-09-07 17:11  光是光光的光呐  阅读(314)  评论(0编辑  收藏  举报