一個關(guān)于開屏頁和引導(dǎo)頁的demo

《優(yōu)雅的插入開屏廣告》-- 不改動任何一行代碼
在這個基礎(chǔ)上再添加了引導(dǎo)頁鞍盗,
=============================================

代碼還是不錯的斋荞,但是個人覺得跑芳,上訴代碼的耦合性還是太強了善玫,需要對 AppDelegate 和 ViewController 等代碼進(jìn)行入侵官硝。如果按照模塊化方式來開發(fā)龄恋,后續(xù)廣告要擴(kuò)展和維護(hù)都是很艱難的趴生,因為你要擔(dān)心你埋入的那些代碼被其他人員改動了阀趴。

下面是我使用的一套方案。真正做到模塊化苍匆,即插即用刘急!

實現(xiàn)原理

自啟動 & 監(jiān)聽

///在load 方法中,啟動監(jiān)聽浸踩,可以做到無注入
+ (void)load
{
    [self shareInstance];
}
- (instancetype)init
{
    self = [super init];
    if (self) {
        
        ///如果是沒啥經(jīng)驗的開發(fā)叔汁,請不要在初始化的代碼里面做別的事,防止對主線程的卡頓检碗,和 其他情況
        
        ///應(yīng)用啟動, 首次開屏廣告
        [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
            ///要等DidFinished方法結(jié)束后才能初始化UIWindow据块,不然會檢測是否有rootViewController
            dispatch_async(dispatch_get_main_queue(), ^{
               [self checkAD]; 
            });
        }];
        ///進(jìn)入后臺
        [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
            [self request];
        }];
        ///后臺啟動,二次開屏廣告
        [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillEnterForegroundNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
            [self checkAD];
        }];
    }
    return self;
}

iOS的通知是一個神器,它會發(fā)出應(yīng)用的啟動折剃,退到后臺等事件通知另假,有了通知我們就可以做到對AppDelegate的無入侵。

只有通知還是沒有用的怕犁,我們還需要顯示边篮。

核心突破點:顯示

- (void)show
{
    ///初始化一個Window, 做到對業(yè)務(wù)視圖無干擾奏甫。
    UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    
    ///廣告布局
    [self setupSubviews:window];
    
    ///設(shè)置為最頂層戈轿,防止 AlertView 等彈窗的覆蓋
    window.windowLevel = UIWindowLevelStatusBar + 1;
    
    ///默認(rèn)為YES,當(dāng)你設(shè)置為NO時阵子,這個Window就會顯示了
    window.hidden = NO;
    
    ///來個漸顯動畫
    window.alpha = 0;
    [UIView animateWithDuration:0.3 animations:^{
        window.alpha = 1;
    }];
    
    ///防止釋放思杯,顯示完后  要手動設(shè)置為 nil
    self.window = window;
}

其實大家一般蓋視圖,習(xí)慣在 KeyWindow 上直接AddSubview款筑, 其實這是不好的智蝠。首先KeyWindow 會被AlertView覆蓋, 還有可能別的業(yè)務(wù)代碼也進(jìn)行了AddSubview 這樣就會把你的廣告給覆蓋了奈梳。

而使用我這種 UIWindow 的初始化杈湾,可以讓你的視圖出現(xiàn)在最頂層,不用怕亂七八糟的業(yè)務(wù)邏輯覆蓋攘须。

調(diào)用KeyWindow 還有個壞處漆撞。下面會說到。

跳轉(zhuǎn)

其實倒計時跟跳轉(zhuǎn)是個很普通的功能點,沒啥說的浮驳。有個關(guān)鍵點還是要說的 就是KeyWindow的調(diào)用

///不直接取KeyWindow 是因為當(dāng)有AlertView 或者有鍵盤彈出時悍汛, 取到的KeyWindow是錯誤的。
    UIViewController* rootVC = [[UIApplication sharedApplication].delegate window].rootViewController;
    [[rootVC imy_navigationController] pushViewController:[IMYWebViewController new] animated:YES];
    

其實 [UIApplication sharedApplication].keyWindow 取到的Window 不一定是你想要的至会。 因為KeyWindow 是會變的离咐,所以勁量使用 [Delegate Window] 來獲取顯示的Window。 做 OS X 的應(yīng)該體會多點奉件。

在送上一個擴(kuò)展宵蛀,獲取任意ViewController的navigationController

@implementation UIViewController (IMYPublic)
- (UINavigationController*)imy_navigationController
{
    UINavigationController* nav = nil;
    if ([self isKindOfClass:[UINavigationController class]]) {
        nav = (id)self;
    }
    else {
        if ([self isKindOfClass:[UITabBarController class]]) {
            nav = [((UITabBarController*)self).selectedViewController imy_navigationController];
        }
        else {
            nav = self.navigationController;
        }
    }
    return nav;
}
@end

demo(gif圖,會動的县貌。术陶。)

然后我在上面的基礎(chǔ)上添加了一個引導(dǎo)頁的視圖,引導(dǎo)頁就是一個scrollview煤痕。實現(xiàn)起來應(yīng)該也沒什么難度

//這段代碼是我做測試的時候用的梧宫,是為了每次啟動都去跑引導(dǎo)頁
NSArray *images = @[@"1", @"2", @"3", @"4"];
    XTGuidePagesViewController *xt = [[XTGuidePagesViewController alloc] init];
    [mainNavVC addChildViewController:xt];
            //self.window.rootViewController = xt;
    xt.delegate = self;
    [xt guidePageControllerWithImages:images];```


//正常的視圖

BOOL y = [XTGuidePagesViewController isShow];
    if (y) {
       XTGuidePagesViewController *xt = [[XTGuidePagesViewController alloc] init];
        self.window.rootViewController = xt;
        xt.delegate = self;
        [xt guidePageControllerWithImages:images];
    }else{
        [self clickEnter];

然后最開始集成的時候,發(fā)現(xiàn)老有問題摆碉,然后看視圖才知道我界面順序沒加對塘匣,開屏頁的根視圖是navigationController。而那個引導(dǎo)頁的根視圖是UIViewController, 改一下appdelegate 里面的東西就可以了

然后如果你要用導(dǎo)航頁的話 吧工程里面的GuidePage里面的文件拖到你的項目里面巷帝,圖片的話可以加載本地的也可以去網(wǎng)上加載馆铁,看你自己項目需要,然后在appdelegate里面插入以下代碼

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    UIViewController *mainVC = [[UIViewController alloc] init];
    UINavigationController *mainNavVC = [[UINavigationController alloc] initWithRootViewController:mainVC];
    [mainNavVC.navigationBar setHidden:YES];
    self.window.rootViewController = mainNavVC;
    [self.window makeKeyAndVisible];
    BOOL y = [XTGuidePagesViewController isShow];
    if (y) {
        XTGuidePagesViewController *xt = [[XTGuidePagesViewController alloc] init];
        self.window.rootViewController = xt;
        xt.delegate = self;
        [xt guidePageControllerWithImages:images];
    }else{
        [self clickEnter];
    }
    return YES;
}
- (void)clickEnter
{
    
    ViewController *vc = [[ViewController alloc] init];
    UINavigationController *mainNavVC = [[UINavigationController alloc] initWithRootViewController:vc];
    [mainNavVC.navigationBar setHidden:YES];
    self.window.rootViewController = mainNavVC;
    [self.window.layer transitionWithAnimType:TransitionAnimTypeRippleEffect subType:TransitionSubtypesFromTop curve:TransitionCurveDefault duration:1.0f];
}

然后這個動畫是只有開屏頁的锅睛,集成了之后 不知道怎么錄gif··
工程目錄:https://github.com/SSnowCat/SNCLaunchDemo-master

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市历谍,隨后出現(xiàn)的幾起案子现拒,更是在濱河造成了極大的恐慌,老刑警劉巖望侈,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件印蔬,死亡現(xiàn)場離奇詭異,居然都是意外死亡脱衙,警方通過查閱死者的電腦和手機侥猬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捐韩,“玉大人退唠,你說我怎么就攤上這事』缧玻” “怎么了瞧预?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我垢油,道長盆驹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任滩愁,我火速辦了婚禮躯喇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘硝枉。我一直安慰自己廉丽,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布檀咙。 她就那樣靜靜地躺著雅倒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弧可。 梳的紋絲不亂的頭發(fā)上蔑匣,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音棕诵,去河邊找鬼裁良。 笑死,一個胖子當(dāng)著我的面吹牛校套,可吹牛的內(nèi)容都是我干的价脾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼笛匙,長吁一口氣:“原來是場噩夢啊……” “哼侨把!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起妹孙,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤秋柄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蠢正,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骇笔,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年嚣崭,在試婚紗的時候發(fā)現(xiàn)自己被綠了笨触。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡雹舀,死狀恐怖芦劣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情说榆,我是刑警寧澤持寄,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布源梭,位于F島的核電站,受9級特大地震影響稍味,放射性物質(zhì)發(fā)生泄漏废麻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一模庐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掂碱,春花似錦怜姿、人聲如沸疼燥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撬即,卻和暖如春立磁,著一層夾襖步出監(jiān)牢的瞬間剥槐,已是汗流浹背唱歧。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粒竖,地道東北人颅崩。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蕊苗,于是被迫代替她去往敵國和親挨摸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

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