在公司上個(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圖~
當(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)階》