02.項目實戰(zhàn) 百思不得姐 自定義導(dǎo)航條,廣告界面

@(iOS 項目實戰(zhàn))[項目實戰(zhàn)]


目錄

  • 1.設(shè)置TabBarItem標(biāo)題顏色,文字大小
    • 使用appearance統(tǒng)一設(shè)置TabBarItem的顏色
  • 2.設(shè)置導(dǎo)航條按鈕
    • 抽取UIBarButtonItem分類
  • 3.統(tǒng)一設(shè)置導(dǎo)航條標(biāo)題字體和背景圖片
  • 4.統(tǒng)一設(shè)置返回按鈕
    • 設(shè)置返回按鈕的位置,調(diào)整返回按鈕的邊距
    • 跳轉(zhuǎn)控制器出現(xiàn)黑色卡頓現(xiàn)象解決方案
  • 5.設(shè)置手勢滑動返回
    • 邊緣滑動返回
    • 全屏滑動返回
  • 6.廣告界面的搭建
    • 廣告界面xib搭建
  • 7.廣告界面的功能實現(xiàn)
    • 廣告界面第三方框架AFNetworking,MJExtension,SDWebImage的使用
    • 獲取廣告數(shù)據(jù)
    • 跳過按鈕注意點
  • 8.CocoaPods的介紹

1.設(shè)置TabBarItem標(biāo)題顏色,文字大小

使用appearance統(tǒng)一設(shè)置TabBarItem的顏色

  • 只要屬性有UI_APPEARANCE_SELECTOR這個宏描述,就可以使用UIAppearance設(shè)置
// ----------------------------------------------------------------------------
// 加載類進內(nèi)存的時候調(diào)用,只會調(diào)用一次(子類不會加載的適合不再加載父類的load方法)
+ (void)load
{
    // 誰才能使用appearance?只要遵守了這個UIAppearance協(xié)議,就能調(diào)用appearance
    // 注意:UIAppearance并不是所有屬性都能設(shè)置
    // 哪些屬性可以通過UIAppearance設(shè)置?只要屬性有UI_APPEARANCE_SELECTOR這個宏描述,就可以使用UIAppearance設(shè)置
    // UIAppearance使用場景
    
    // 一次性設(shè)置tabBarItem字體顏色
    // ------------------------------------------------------------------------
    // 1.判斷是否是WXTabBarController類
    // 1.1 獲取item
    UITabBarItem *item = [UITabBarItem appearanceWhenContainedIn:self, nil];
    
    // 1.2 設(shè)置
    NSDictionary *attrSelected = @{NSForegroundColorAttributeName : [UIColor blackColor]};
    [item setTitleTextAttributes:attrSelected forState:UIControlStateSelected];
    
    // ----------------------------------------------------------------------------
    // 2.設(shè)置普通狀態(tài)下的TabBar字體大小, 注意:一定要先設(shè)置正常狀態(tài)下字體大小
    NSDictionary *attrNormal = @{NSFontAttributeName : [UIFont systemFontOfSize:13]};
    [item setTitleTextAttributes:attrNormal forState:UIControlStateNormal];
    
}

2.設(shè)置導(dǎo)航條按鈕

多個控制器設(shè)置導(dǎo)航條按鈕都要設(shè)置UIBarButtonItem,所有抽取設(shè)置UIBarButtonItem信息的分類

抽取UIBarButtonItem分類

  • 導(dǎo)航條的按鈕的點擊范圍大,點擊按鈕以外的區(qū)域也會觸發(fā)點擊事件
    • 解決方案,用一個UIView對按鈕進行包裝

3.統(tǒng)一設(shè)置導(dǎo)航條標(biāo)題字體和背景圖片

  • 設(shè)置導(dǎo)航條標(biāo)題字體/背景圖片
// ----------------------------------------------------------------------------
// 第一次加載到內(nèi)存調(diào)用,只會調(diào)用一次,在load方法中統(tǒng)一設(shè)置導(dǎo)航條的背景圖片和標(biāo)題文字大小
+ (void)load
{
    // 1.獲取全局的導(dǎo)航條
    UINavigationBar *navBar = [UINavigationBar appearanceWhenContainedIn:self, nil];
    
    // 2.設(shè)置導(dǎo)航條標(biāo)題文字大小
    NSDictionary *titleAttr = @{NSFontAttributeName : [UIFont systemFontOfSize:20]};
    [navBar setTitleTextAttributes:titleAttr];
    
    // 3.設(shè)置導(dǎo)航條背景圖片:一定要是UIBarMetricsDefault
    // iOS8和iOS9適配: iOS9之前:UIBarMetricsDefault,導(dǎo)航控制器跟控制器的view尺寸會減少64,iOS9就沒有減少64了
    [navBar setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];
}

4.統(tǒng)一設(shè)置返回按鈕

如果通過自定義導(dǎo)航條返回按鈕,則導(dǎo)航控制器默認的邊緣滑動返回效果失效.

設(shè)置返回按鈕的位置,調(diào)整返回按鈕的邊距

  • 要統(tǒng)一設(shè)置返回按鈕,重寫push方法
    • 要調(diào)整導(dǎo)航條的按鈕位置,可以設(shè)置按鈕的內(nèi)邊距
      backButton.contentEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0);
    • 設(shè)置內(nèi)邊距之前,需先設(shè)置按鈕的尺寸.否則位置會有偏差.[backButton sizeToFit];
// ----------------------------------------------------------------------------
// 重寫pushViewController:方法,在跳轉(zhuǎn)前統(tǒng)一設(shè)置返回按鈕
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    // ------------------------------------------------------------------------
    // 1.判斷如果不是根控制器,則設(shè)置viewController控制器返回按鈕
    if (self.childViewControllers.count > 0) {
        
        viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem backItemWithImage:[UIImage imageNamed:@"navigationButtonReturn"] highImage:[UIImage imageNamed:@"navigationButtonReturnClick"] target:self action:@selector(back) title:@"返回"];
    }
    
    [super pushViewController:viewController animated:animated];
}

跳轉(zhuǎn)控制器出現(xiàn)黑色卡頓現(xiàn)象解決方案

  • 如果push目標(biāo)控制器的view的背景色為透明就會出現(xiàn)卡頓現(xiàn)象
    • 只要將要push的目標(biāo)控制器view的背景色設(shè)置為其他顏色即可解決.

5.設(shè)置手勢滑動返回

邊緣滑動返回

  • 邊緣滑動返回實現(xiàn)方式一,清空代理(該方法不可行)

// 如果直接將系統(tǒng)手勢清空,會有返回效果,但是在根控制器邊緣滑動會導(dǎo)致出現(xiàn)假死狀態(tài),該方法不可行
    self.interactivePopGestureRecognizer.delegate = nil;
  • 邊緣滑動返回實現(xiàn)方式二,設(shè)置導(dǎo)航控制器為系統(tǒng)手勢代理,只通過gestureRecognizer代理方法返回手勢只在非根控制器滑動有效.
- (void)viewDidLoad {
    [super viewDidLoad];
 
    // // 恢復(fù)系統(tǒng)手勢邊緣滑動返回方式二(可行)
    self.interactivePopGestureRecognizer.delegate = self;
    
}

// ----------------------------------------------------------------------------
// 監(jiān)聽系統(tǒng)滑動手勢,如果返回YES表示
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    // 設(shè)置只有在非根控制器滑動有效,因為如果根控制器滑動如果觸發(fā)手勢會調(diào)用pop,根控制器不能再pop,會導(dǎo)致假死.
    return self.childViewControllers.count > 1;
}

全屏滑動返回

  • 全屏滑動思路:

只要觸發(fā)UIScreenEdgePanGestureRecognizer,就會調(diào)用_UINavigationInteractiveTransition的handleNavigationTransition:
_UINavigationInteractiveTransition的handleNavigationTransition有滑動返回功能

  • 全屏滑動返回思路:
    為什么導(dǎo)航控制器只能邊緣觸發(fā)手勢 -> 打印系統(tǒng)手勢分析 -> 添加Pan手勢
    -> pan有滑動返回功能
    系統(tǒng)手勢打印結(jié)果:
    NSLog(@"%@", self.interactivePopGestureRecognizer);
    
    <UIScreenEdgePanGestureRecognizer: 0x7feab3e30c40; state = Possible; delaysTouchesBegan = YES; view = <UILayoutContainerView 0x7feab3c8fb10>; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7feab3e306d0>)>>
    
    
    系統(tǒng)手勢代理打印結(jié)果:
    NSLog(@"%@", self.interactivePopGestureRecognizer.delegate);
    
    <_UINavigationInteractiveTransition: 0x7feab3e306d0>
    
    打印結(jié)果分析: 系統(tǒng)手勢代理是
  • 經(jīng)以上驗證可得

    • UIScreenEdgePanGestureRecognizer:邊緣滑動手勢
    • UIPanGestureRecognizer:全屏,整個范圍
    • target:_UINavigationInteractiveTransition
    • action=handleNavigationTransition:
  • 添加全屏滑動返回手勢功能實現(xiàn)方案

    • 添加Pan拖動手勢, Pan手勢監(jiān)聽到拖動手勢,調(diào)用target(代理self.interactivePopGestureRecognizer.delegate):_UINavigationInteractiveTransition 的handleNavigationTransition:方法.
    • 取消系統(tǒng)的手勢self.interactivePopGestureRecognizer.enabled = NO;.
  • 全屏滑動返回實現(xiàn)參考代碼

#pragma =======================================================================
#pragma mark - 設(shè)置滑動返回手勢
- (void)viewDidLoad {
    [super viewDidLoad];
 
    // 恢復(fù)系統(tǒng)手勢邊緣滑動返回方式一(不可行)
    // 如果直接將系統(tǒng)手勢清空,會有返回效果,但是在根控制器邊緣滑動會導(dǎo)致出現(xiàn)假死狀態(tài),該方法不可行
//    self.interactivePopGestureRecognizer.delegate = nil;
    
    // // 恢復(fù)系統(tǒng)手勢邊緣滑動返回方式二(可行)
//    self.interactivePopGestureRecognizer.delegate = self;
    
    
    // 添加全屏滑動手勢
    
    /** 
     系統(tǒng)手勢打印結(jié)果:
     NSLog(@"%@", self.interactivePopGestureRecognizer);
     
     <UIScreenEdgePanGestureRecognizer: 0x7feab3e30c40; state = Possible; delaysTouchesBegan = YES; view = <UILayoutContainerView 0x7feab3c8fb10>; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7feab3e306d0>)>>
     
     
     系統(tǒng)手勢代理打印結(jié)果:
     NSLog(@"%@", self.interactivePopGestureRecognizer.delegate);
     
     <_UINavigationInteractiveTransition: 0x7feab3e306d0>
     
     打印結(jié)果分析: 系統(tǒng)手勢代理是
     
     */
    
    // 1.獲取方法的調(diào)用者
    id target = self.interactivePopGestureRecognizer.delegate;
    
    // 2.給系統(tǒng)的view添加手勢,監(jiān)聽到手勢調(diào)用原來系統(tǒng)手勢代理調(diào)用的方法
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
    // 2.1 設(shè)置手勢代理,用于在代理方法中設(shè)置非控制器才能滑動返回
    pan.delegate = self;
    [self.view addGestureRecognizer:pan];
    
    // 3.取消系統(tǒng)手勢
    self.interactivePopGestureRecognizer.enabled = NO;
}

// ----------------------------------------------------------------------------
// 監(jiān)聽系統(tǒng)滑動手勢,如果返回YES表示允許滑動手勢
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    // 設(shè)置只有在非根控制器滑動有效,因為如果根控制器滑動如果觸發(fā)手勢會調(diào)用pop,根控制器不能再pop,會導(dǎo)致假死.
    return self.childViewControllers.count > 1;
}

6.廣告界面的搭建

廣告界面xib搭建

  • 啟動完成添加廣告界面
  • 直接設(shè)置窗口的根控制器為廣告控制器
  • 用xib創(chuàng)建廣告界面
    • 確保按鈕和廣告圖片的層級結(jié)構(gòu),采用占位視圖思想.添加一個全屏的view和一個按鈕
    • 廣告界面xib布局如圖所示
廣告界面xib布局.png

7.廣告界面的功能實現(xiàn)

廣告界面第三方框架AFNetworking,MJExtension,SDWebImage的使用

  • 完整的URL

    • 完整的URL = 基本URL + 參數(shù)
  • AFNetworking發(fā)送GET請求獲取text/html類型的數(shù)據(jù)

    • 設(shè)置支持響應(yīng)體text/html類型的數(shù)據(jù)解析

      • 方式一(不建議直接修改AFN框架源碼): 直接修改AFURLResponseSerialization.m文件中支持text/html類型的數(shù)據(jù),在init方法中添加支持@"text/html"
      self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];
      
      • 方式二: 外部設(shè)置支持響應(yīng)體text/html類型的數(shù)據(jù)解析
      // 1.創(chuàng)建請求回話管理者
      AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
      // ------------------------------------------------------------------------
      // 2. 設(shè)置響應(yīng)體的數(shù)據(jù)格式,添加@"text/html"
      AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
      serializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];
      manager.responseSerializer = serializer;
      
  • AFNetworking發(fā)送GET請求獲取text/html類型的數(shù)據(jù)核心代碼

    // ------------------------------------------------------------------------
    // 1.創(chuàng)建請求回話管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    // ------------------------------------------------------------------------
    // 2. 設(shè)置響應(yīng)體的數(shù)據(jù)格式,添加@"text/html"
    AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
    serializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];
    manager.responseSerializer = serializer;
    
    // ------------------------------------------------------------------------
    // 3.拼接請求參數(shù)
    NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
    parameters[@"code2"] = code2;
    
    // ------------------------------------------------------------------------
    // 4.請求廣告數(shù)據(jù)
    [manager GET:@"http://mobads.baidu.com/cpro/ui/mads.php" parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"請求成功");
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@", error);
    }];
  • MJExtension字典轉(zhuǎn)模型

    • mj_objectWithKeyValues:方法作用是取出服務(wù)器返回的眾多JSON數(shù)據(jù)中的有用的模型參數(shù).
    WXAdItem *adItem = [WXAdItem mj_objectWithKeyValues:adDict];
    

獲取廣告數(shù)據(jù)

  • 查看百思接口文檔,點擊廣告API獲取進入程序后展示的廣告頁數(shù)據(jù)URL跳轉(zhuǎn)到數(shù)據(jù)頁

    • 獲取廣告數(shù)據(jù)真實的URL和服務(wù)器返回的JSON數(shù)據(jù)

      廣告接口數(shù)據(jù).png

    • 使用JSON解析工具分析廣告展示所需數(shù)據(jù)(w_picurl , ori_curl , w , h)

      廣告接口JSON數(shù)據(jù).png

  • 廣告界面效果圖


    廣告界面效果圖.png
  • 廣告功能界面實現(xiàn)步驟

    • 1.設(shè)置廣告界面啟動背景圖片,根據(jù)屏幕的高度做啟動背景圖片屏幕適配
    • 2.請求廣告數(shù)據(jù)
      • 1.創(chuàng)建請求回話管理者
        1. 設(shè)置響應(yīng)體的數(shù)據(jù)格式,添加@"text/html"
      • 3.拼接請求參數(shù)
      • 4.請求廣告數(shù)據(jù)
        • 4.1 獲取廣告數(shù)據(jù) ,返回的廣告數(shù)據(jù)是數(shù)組,有[],所以要用lastObject取出數(shù)據(jù)
        • 需判斷是否請求到數(shù)據(jù),如果沒有數(shù)據(jù),則退出,如果沒判斷,請求失敗會導(dǎo)致應(yīng)用奔潰.
        • 4.2 字典轉(zhuǎn)模型 mj_objectWithKeyValues:方法作用是將字典轉(zhuǎn)換成對應(yīng)的模型
        • 4.3 設(shè)置廣告界面的數(shù)據(jù),返回數(shù)據(jù)中有廣告圖片的尺寸
        • 4.4 添加點擊手勢,點擊圖片跳轉(zhuǎn)到廣告頁
    • 3.通過定時器定時更新跳過按鈕的標(biāo)題數(shù)字更新
    • 4.定時時間到或用戶點擊跳過按鈕,直接跳轉(zhuǎn)到TabBarController.
  • 判斷url是否有效

 if ([[UIApplication sharedApplication] canOpenURL:url]);
  • 廣告界面功能參考代碼
#import "WXAdViewController.h"
#import <MJExtension.h>
#import <UIImageView+WebCache.h>
#import <AFNetworking.h>
#import "WXTabBarController.h"
#import "WXAdItem.h"

static NSString * const code2 = @"phcqnauGuHYkFMRquANhmgN_IauBThfqmgKsUARhIWdGULPxnz3vndtkQW08nau_I1Y1P1Rhmhwz5Hb8nBuL5HDknWRhTA_qmvqVQhGGUhI_py4MQhF1TvChmgKY5H6hmyPW5RFRHzuET1dGULnhuAN85HchUy7s5HDhIywGujY3P1n3mWb1PvDLnvF-Pyf4mHR4nyRvmWPBmhwBPjcLPyfsPHT3uWm4FMPLpHYkFh7sTA-b5yRzPj6sPvRdFhPdTWYsFMKzuykEmyfqnauGuAu95Rnsnbfknbm1QHnkwW6VPjujnBdKfWD1QHnsnbRsnHwKfYwAwiu9mLfqHbD_H70hTv6qnHn1PauVmynqnjclnj0lnj0lnj0lnj0lnj0hThYqniuVujYkFhkC5HRvnB3dFh7spyfqnW0srj64nBu9TjYsFMub5HDhTZFEujdzTLK_mgPCFMP85Rnsnbfknbm1QHnkwW6VPjujnBdKfWD1QHnsnbRsnHwKfYwAwiuBnHfdnjD4rjnvPWYkFh7sTZu-TWY1QW68nBuWUHYdnHchIAYqPHDzFhqsmyPGIZbqniuYThuYTjd1uAVxnz3vnzu9IjYzFh6qP1RsFMws5y-fpAq8uHT_nBuYmycqnau1IjYkPjRsnHb3n1mvnHDkQWD4niuVmybqniu1uy3qwD-HQDFKHakHHNn_HR7fQ7uDQ7PcHzkHiR3_RYqNQD7jfzkPiRn_wdKHQDP5HikPfRb_fNc_NbwPQDdRHzkDiNchTvwW5HnvPj0zQWndnHRvnBsdPWb4ri3kPW0kPHmhmLnqPH6LP1ndm1-WPyDvnHKBrAw9nju9PHIhmH9WmH6zrjRhTv7_5iu85HDhTvd15HDhTLTqP1RsFh4ETjYYPW0sPzuVuyYqn1mYnjc8nWbvrjTdQjRvrHb4QWDvnjDdPBuk5yRzPj6sPvRdgvPsTBu_my4bTvP9TARqnam";

@interface WXAdViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *launchImageView;
@property (weak, nonatomic) IBOutlet UIView *adView;
@property (weak, nonatomic) IBOutlet UIButton *jumpButton;

@property (nonatomic, strong) NSTimer *timer;
@property (nonatomic, strong) WXAdItem *adItem;
@end

@implementation WXAdViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 1.設(shè)置啟動圖片,屏幕適配
    [self setupLaunchImageView];
    
    // 2.請求廣告數(shù)據(jù)
    [self loadAdData];
    
    // 3.創(chuàng)建定時器
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
    [self timeChange];
}

#pragma =======================================================================
#pragma mark - 啟動圖片屏幕適配,請求廣告數(shù)據(jù),定時器

// ----------------------------------------------------------------------------
// 設(shè)置啟動圖片,屏幕適配,根據(jù)屏幕的高度
- (void)setupLaunchImageView
{
    UIImage *image = nil;
    // ------------------------------------------------------------------------
    // 適配啟動背景圖片
    if (iPhone4) {
        image = [UIImage imageNamed:@"LaunchImage"];
    } else if (iPhone5) {
        image = [UIImage imageNamed:@"LaunchImage-568h"];
    } else if (iPhone6) {
        image = [UIImage imageNamed:@"LaunchImage-800-667h"];
    } else if (iPhone6p) {
        image = [UIImage imageNamed:@"LaunchImage-800-Portrait-736h@3x"];
    }
    
    // 設(shè)置啟動背景圖片
    self.launchImageView.image = image;
}

// ----------------------------------------------------------------------------
// 請求廣告數(shù)據(jù)
- (void)loadAdData
{
    // ------------------------------------------------------------------------
    // 1.創(chuàng)建請求回話管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    // ------------------------------------------------------------------------
    // 2. 設(shè)置響應(yīng)體的數(shù)據(jù)格式,添加@"text/html"
    AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer];
    serializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];
    manager.responseSerializer = serializer;
    
    // ------------------------------------------------------------------------
    // 3.拼接請求參數(shù)
    NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
    parameters[@"code2"] = code2;
    
    // ------------------------------------------------------------------------
    // 4.請求廣告數(shù)據(jù)
    [manager GET:@"http://mobads.baidu.com/cpro/ui/mads.php" parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        // 判斷取回來的數(shù)據(jù)是否正確
        
        // 4.1 獲取廣告數(shù)據(jù) ,返回的廣告數(shù)據(jù)是數(shù)組,有[],所以要用lastObject取出數(shù)據(jù)
        NSDictionary *adDict = [responseObject[@"ad"] lastObject];
        
        // 判斷是否請求到數(shù)據(jù),如果沒有數(shù)據(jù),則退出
        if (adDict == nil) {
            return;
        }
        // 4.2 字典轉(zhuǎn)模型 mj_objectWithKeyValues:方法作用是將字典轉(zhuǎn)換成對應(yīng)的模型
        WXAdItem *adItem = [WXAdItem mj_objectWithKeyValues:adDict];
        self.adItem = adItem;
        
        // 4.3 設(shè)置廣告界面的數(shù)據(jù),返回數(shù)據(jù)中有廣告圖片的尺寸
        CGFloat w = screenW;
        CGFloat h = screenW / adItem.w * adItem.h;
        UIImageView *adImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, w, h)];
        [adImageView sd_setImageWithURL:[NSURL URLWithString:adItem.w_picurl]];
        [self.adView addSubview:adImageView];
        adImageView.userInteractionEnabled = YES;
        
        // 4.4 添加點擊手勢,點擊圖片跳轉(zhuǎn)到廣告頁
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap)];
        [adImageView addGestureRecognizer:tap];
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@", error);
    }];
  
}

// ----------------------------------------------------------------------------
// 定時更新按鈕的標(biāo)題,定時時間到則跳轉(zhuǎn)
- (void)timeChange
{
    static NSInteger timeIndex = 3;
    // 更新跳過按鈕標(biāo)題
    [self.jumpButton setTitle:[NSString stringWithFormat:@"跳過 (%ld)", timeIndex] forState:UIControlStateNormal];
    
    if (timeIndex-- < 0) {
        [self.timer invalidate];
        [self jump];
    }
}


#pragma =======================================================================
#pragma mark - 跳過按鈕點擊, 點擊廣告圖片跳轉(zhuǎn)
// ----------------------------------------------------------------------------
// 監(jiān)聽點擊跳過按鈕
- (IBAction)jump {
    
    // 關(guān)閉定時器
    [self.timer invalidate];
    
    WXTabBarController *tabBarVc = [[WXTabBarController alloc] init];
    
    [UIApplication sharedApplication].keyWindow.rootViewController = tabBarVc;
}

// ----------------------------------------------------------------------------
// 監(jiān)聽廣告圖片點擊
- (void)tap
{
    // 檢查url是否能打開
    NSURL *url = [NSURL URLWithString:self.adItem.ori_curl];
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:self.adItem.ori_curl]];
    }
}

  • 廣告界面效果圖


    廣告界面效果圖.png

跳過按鈕注意點

  • 按鈕如果是System類型的,在重新設(shè)置按鈕標(biāo)題時會閃爍.需把按鈕的類型改成Custom自定義類型按鈕.

8.CocoaPods的介紹

CocoaPods:管理第三方框架

podfile文件:描述加載哪些第三方框架

  • cocoapods的使用步驟
    • 1.創(chuàng)建podfile,在當(dāng)前工程目錄下
    • 2.touch podfile touch:新建
    • 3.open podfile打開這個文件
    • 4.pod search MJExtension 搜索框架
    • 5.描述好podfile
    • 6.pod install --no-repo-update 不執(zhí)行pod repo update,比較快速導(dǎo)入第三份框架
  • cocoapods指令簡介

Podfile.lock:第一次pod完,自動生成這個文件,記錄當(dāng)前需要加載框架的版本號
終端指令 -help 學(xué)習(xí)
pod install 1.判斷下有沒有Podfile.lock,如果有,根據(jù)Podfile.lock加載,沒有,根據(jù)Podfile文件去加載
pod update 2.更新需要加載框架的版本號,并且創(chuàng)建新的Podfile.lock
--no-repo-update:不執(zhí)行pod repo update
pod repo update : 更新倉庫索引,獲取所有框架最新版本
pod install --no-repo-update : 比較快速導(dǎo)入第三份框架

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疾忍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子床三,更是在濱河造成了極大的恐慌一罩,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撇簿,死亡現(xiàn)場離奇詭異聂渊,居然都是意外死亡,警方通過查閱死者的電腦和手機四瘫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門汉嗽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人找蜜,你說我怎么就攤上這事饼暑。” “怎么了洗做?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵弓叛,是天一觀的道長。 經(jīng)常有香客問我诚纸,道長撰筷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任畦徘,我火速辦了婚禮毕籽,結(jié)果婚禮上抬闯,老公的妹妹穿的比我還像新娘。我一直安慰自己影钉,他們只是感情好画髓,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布掘剪。 她就那樣靜靜地躺著平委,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夺谁。 梳的紋絲不亂的頭發(fā)上廉赔,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音匾鸥,去河邊找鬼蜡塌。 笑死,一個胖子當(dāng)著我的面吹牛勿负,可吹牛的內(nèi)容都是我干的馏艾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼奴愉,長吁一口氣:“原來是場噩夢啊……” “哼琅摩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锭硼,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤房资,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后檀头,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轰异,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年暑始,在試婚紗的時候發(fā)現(xiàn)自己被綠了搭独。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡廊镜,死狀恐怖牙肝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情期升,我是刑警寧澤惊奇,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站播赁,受9級特大地震影響颂郎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜容为,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一乓序、第九天 我趴在偏房一處隱蔽的房頂上張望寺酪。 院中可真熱鬧,春花似錦替劈、人聲如沸寄雀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盒犹。三九已至,卻和暖如春眨业,著一層夾襖步出監(jiān)牢的瞬間急膀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工龄捡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卓嫂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓聘殖,卻偏偏與公主長得像晨雳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奸腺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫餐禁、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,058評論 4 62
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,732評論 25 707
  • section1:游戲的前奏 兩周前洋机,我的小宇宙經(jīng)歷了一場變革坠宴,我相信這場變革還在繼續(xù)。 一個無聊的下午绷旗,我像往常...
    金笛Jindi閱讀 136評論 0 0
  • 不能因為你見過了太陽 你就開始厭倦繁星的平庸 太陽有時候也熱烈到土地干涸 民不聊生 而繁星也點綴了黑暗的夜空
    一個女人的私密日記閱讀 242評論 0 0
  • 《老九門》播出過半熱度未消,礦洞內(nèi)危機重重角骤,礦洞外勾心斗角隅忿,劇情燒腦,令人欲罷不能邦尊,無論演員和劇情都可圈可點背桐。一眾...
    酷聽聽書閱讀 359評論 0 0