在UIWindow上加類似于“回到頂部”的按鈕

在公司上個(gè)版本的開發(fā)中遇到了一個(gè)UI布局的小問題:

某個(gè)頁面需要增加一個(gè)分享按鈕,但是該頁面是二級(jí)頁面湿镀,導(dǎo)航欄右邊也已經(jīng)放置了2個(gè)button炕吸。
起初和老大談?wù)撨@個(gè)問題的時(shí)候想到的方法是導(dǎo)航欄右邊加三個(gè)button得了~但是一回想,這貌似太丑了勉痴!雖然兩人都不是處女座赫模,不過這個(gè)方法算是pass掉了
當(dāng)天下班前想起瀏覽網(wǎng)頁的時(shí)候經(jīng)常會(huì)在滑動(dòng)的時(shí)候右下方出現(xiàn)一個(gè)“回到頂部”的按鈕,似乎在iOS客戶端也可以實(shí)現(xiàn)這一類似的功能蒸矛。

原理:獲取到keywindow瀑罗,然后在keywindow上面添加一個(gè)bgView,在bgView上面加上一個(gè)UIButton(之所以這樣包裝一層是為了美觀一點(diǎn)雏掠,想將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
    {
      //創(chuàng)建分享視圖
      [self shareView];
    }

有一點(diǎn)需要注意:即如果我們這樣設(shè)置了斩祭,那么需要進(jìn)行下一步操作(在視圖pop的時(shí)候,移除shareBtn)乡话,否則shareBtn會(huì)一直顯示在keywindow上面

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

當(dāng)然還有一點(diǎn)

細(xì)心的同學(xué)會(huì)發(fā)現(xiàn)我在bgView設(shè)置了alpha值為0.9摧玫,這樣依然會(huì)遮擋住下面的視圖,影響用戶瀏覽

為此我做了如下設(shè)置:
1绑青、值得說一下的是诬像,整個(gè)二級(jí)頁面的層級(jí)結(jié)構(gòu)是
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);

對(duì)于UIScrollViewDelegate大家應(yīng)該不陌生了

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

當(dāng)然一定不要忘了簽約:webView.scrollView.delegate = self;
對(duì)于- (void)createShareBtn方法的調(diào)用隨大家需求所定

1闸婴、如果需要長期顯示坏挠,可以在- (void)viewDidLoad方法里調(diào)用(此處還有一個(gè)小技巧:createShareBtn在createWebView之后??)
2、如果只是在滑動(dòng)時(shí)顯示邪乍,可以在UIScrollViewDelegate的代理方法里調(diào)用

希望能幫助大家(ps:為什么不直接加在webView上呢斟叼?博主前段時(shí)候在群里看到小伙伴討論keywindow吏饿,然后心血來潮想試試keywindow而已??)
暫貼一張手機(jī)錄的GIF圖~

123.gif


當(dāng)然說一個(gè)與本文無關(guān)的巫玻,關(guān)于UIWindow的題外話:

不要濫用UIWindow!不要濫用柏肪!不濫用!(重要的事說三遍??)

通過創(chuàng)建UIWindow芥牌,我們很容易地實(shí)現(xiàn)了將某個(gè)特定界面置于最上層的效果烦味,但是這種特性不應(yīng)該被濫用。很多時(shí)候壁拉,如果彈出界面明顯屬于某一個(gè)ViewController谬俄,那么更適合把彈出的界面當(dāng)做這個(gè)ViewController的view的subView來實(shí)現(xiàn)。
常見的濫用方式是把需要的彈出界面都設(shè)置成單例弃理,需要的時(shí)候就調(diào)用顯示溃论。這種做法會(huì)使得新創(chuàng)建的UIWindow一直得不到釋放。并且當(dāng)出現(xiàn)多個(gè)UIWindow需要相互有層級(jí)覆蓋關(guān)系時(shí)痘昌,實(shí)現(xiàn)起來比較復(fù)雜钥勋。
---《iOS開發(fā)進(jìn)階》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市辆苔,隨后出現(xiàn)的幾起案子算灸,更是在濱河造成了極大的恐慌,老刑警劉巖驻啤,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菲驴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡骑冗,警方通過查閱死者的電腦和手機(jī)赊瞬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贼涩,“玉大人巧涧,你說我怎么就攤上這事∫>耄” “怎么了褒侧?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谊迄。 經(jīng)常有香客問我闷供,道長,這世上最難降的妖魔是什么统诺? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任歪脏,我火速辦了婚禮,結(jié)果婚禮上粮呢,老公的妹妹穿的比我還像新娘婿失。我一直安慰自己钞艇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布豪硅。 她就那樣靜靜地躺著哩照,像睡著了一般。 火紅的嫁衣襯著肌膚如雪懒浮。 梳的紋絲不亂的頭發(fā)上飘弧,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音砚著,去河邊找鬼次伶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛稽穆,可吹牛的內(nèi)容都是我干的冠王。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舌镶,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼柱彻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起餐胀,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤哟楷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后骂澄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吓蘑,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惕虑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年坟冲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溃蔫。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡健提,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伟叛,到底是詐尸還是另有隱情私痹,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布统刮,位于F島的核電站紊遵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏侥蒙。R本人自食惡果不足惜暗膜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鞭衩。 院中可真熱鬧学搜,春花似錦娃善、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炬丸,卻和暖如春瘫寝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背御雕。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工矢沿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酸纲。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓捣鲸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闽坡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子栽惶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容