凌駕所有視圖之上的SuperView

問題

開發(fā)中可能會遇到這樣的問題:使一個View在屏幕中不被任何視圖遮蓋?
如果遇到類似的問題泄伪,這篇文章及示例可能對你有所啟發(fā)蹬屹。

效果圖

superview.gif

實現(xiàn)

UIWindow了解

要想實現(xiàn)這樣的效果缚态,首先要明白知道UIWindow以及一個應(yīng)用如何通過UIWindow顯示到屏幕扮碧。這里有一篇文章的講的很詳細趟章。
關(guān)于UIWindow,這里講兩點:

  • UIWindow是一個特殊的UIView,一個app至少要有一個UIWindow,不論是UIView還是UIViewController,最終還是要通過UIWindow將視圖繪制到屏幕上慎王,才能顯示蚓土。

  • UIWindow 有分層級(windowLevel),層級越高柬祠,顯示在屏幕最上方北戏。層級相同時负芋,后面調(diào)用的UIWindow顯示在上方漫蛔。官方提供了三個常用層級:

    • UIWindowLevelNormal ---> 0
    • UIWindowLevelAlert ---> 2000
    • UIWindowLevelStatusBar ---> 1000
      鍵盤所在的UIRemoteKeyboardWindow 層級是10000000。

SuperView的實現(xiàn)原理

  • 創(chuàng)建一個獨立的UIWindow, 尺寸和SuperView一樣旧蛾。調(diào)用window 的 makeKeyAndVisible方法莽龟。別忘了調(diào)整superView在window 的frame。
- (void)show {
    
    UIWindow *currentKeyWindow = [UIApplication sharedApplication].keyWindow;
    
    NSLog(@"super view frame: %@", NSStringFromCGRect(self.frame));
    if (!_superviewWindow) {
        _superviewWindow = [[BQSuperViewWindow alloc] initWithFrame:_currentFrame];
        _superviewWindow.rootViewController = [ BQSuperViewController new];
    } else {
        _superviewWindow.frame = _currentFrame;
    }
    
    [_superviewWindow makeKeyAndVisible];
    
    self.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
    
    self.layer.cornerRadius = self.frame.size.width <= self.frame.size.height ? self.frame.size.width / 2.0 : self.frame.size.height / 2.0;
    
    [_superviewWindow addSubview:self];
    
    // keep the original keyWindow to avoid some unpredictable problems
    [currentKeyWindow makeKeyWindow];

}

要顯示在屏幕最上方锨天,窗口的windowLevel要夠大毯盈。

  • 添加拖動手勢,根據(jù)拖動位置更新window的frame病袄。
    至于多動的邊界控制其實挺簡單搂赋,詳細代碼后面有鏈接赘阀。
[UIView animateWithDuration:.25 animations:^{
            _superviewWindow.center = newCenter;
            //
            if (_superviewWindow.hidden == YES) {
                self.center = newCenter;
            }
            
            // record frame for superview back to superviewWindow
            _currentFrame = _superviewWindow.frame;
        }];

  • 添加鍵盤彈出和隱藏的通知,
    鍵盤顯示時脑奠,隱藏獨立的window基公。然后將superView在屏幕中的frame換算到UIRemoteKeyboardWindow中顯示。
    鍵盤隱藏時宋欺,重新顯示獨立的window轰豆,根據(jù)superView(frame可能變化)的最新frame設(shè)置window的位置并顯示。
- (void)keyboardIsShown:(NSNotification *)note {
    
    [self convertSuperViewToKeyboardWindow];
}
- (void)keyboardDidHide {
    
    [self show];
}

- (void)convertSuperViewToKeyboardWindow {
    //hide the superViewWindow
    [self hide];
    
    // add superView in keyboardWindow
    self.frame = _currentFrame;
    
    [[self keyboardWindow] addSubview:self];
}

最后的最后

1.完整的實現(xiàn)代碼在這里齿诞!
2.如果有更好的實現(xiàn)酸休,可以給在評論區(qū)留言〉昏荆或者在github上提出斑司,我會及時跟進。
3.別忘了點贊哈但汞!別忘了點贊哈陡厘!別忘了點贊哈!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末特占,一起剝皮案震驚了整個濱河市糙置,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌是目,老刑警劉巖谤饭,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異懊纳,居然都是意外死亡揉抵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門嗤疯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冤今,“玉大人,你說我怎么就攤上這事茂缚∠钒眨” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵脚囊,是天一觀的道長龟糕。 經(jīng)常有香客問我,道長悔耘,這世上最難降的妖魔是什么讲岁? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上缓艳,老公的妹妹穿的比我還像新娘校摩。我一直安慰自己,他們只是感情好阶淘,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布秧耗。 她就那樣靜靜地躺著舶治,像睡著了一般分井。 火紅的嫁衣襯著肌膚如雪霉猛。 梳的紋絲不亂的頭發(fā)上尺锚,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機與錄音惜浅,去河邊找鬼瘫辩。 笑死,一個胖子當著我的面吹牛坛悉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播裸影,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼轩猩!你這毒婦竟也來了卷扮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤均践,失蹤者是張志新(化名)和其女友劉穎晤锹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鞭铆,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡焦影,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了偷办。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澄港。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖回梧,靈堂內(nèi)的尸體忽然破棺而出废岂,到底是詐尸還是另有隱情,我是刑警寧澤湖苞,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站财骨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏隆箩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一杨蛋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧理澎,春花似錦、人聲如沸糠爬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捅膘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滚粟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工凡壤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留署尤,地道東北人。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓亚侠,卻偏偏與公主長得像曹体,于是被迫代替她去往敵國和親硝烂。 傳聞我的和親對象是個殘疾皇子箕别,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

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

  • 1.尺寸適配1.原因 iOS7中所有導(dǎo)航欄都為半透明串稀,導(dǎo)航欄(height=44)和狀態(tài)欄(height=20)不...
    LZM輪回閱讀 6,124評論 1 4
  • 概述 UIView或者它的子類知道怎樣將自己繪制在一個矩形區(qū)域中。我們app所有可視的的界面來自于視圖清寇。創(chuàng)建和配置...
    smalldu閱讀 877評論 0 6
  • 簡單的懸浮小球demo下載地址 1.UIWindow簡介 一個UIWindow對象為應(yīng)用程序的用戶界面提供了背景以...
    雷鳴1010閱讀 10,358評論 2 7
  • 一、問題背景 最近需求量放緩陷遮,想起了以前曾經(jīng)later的小需求,也就是彈出來的AlertView中間的文本框輸入一...
    唐笛_Dylan閱讀 18,376評論 6 29
  • 一直以來人都很單純帽馋,從小就被教育要努力,努力考高的分數(shù)上好的學(xué)校比吭,找好的工作賺更高的薪水绽族,這么一個程序邏輯上并沒有...
    國璽同學(xué)閱讀 778評論 0 1