@(iOS 項目實戰(zhàn))[項目實戰(zhàn)]
- 作者: Liwx
- 郵箱: 1032282633@qq.com
目錄
- 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];
- 要調(diào)整導(dǎo)航條的按鈕位置,可以設(shè)置按鈕的內(nèi)邊距
// ----------------------------------------------------------------------------
// 重寫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;
.
- 添加Pan拖動手勢, Pan手勢監(jiān)聽到拖動手勢,調(diào)用
全屏滑動返回實現(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布局如圖所示
- 確保按鈕和廣告圖片的層級結(jié)構(gòu),采用
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;
- 方式一(不建議直接修改AFN框架源碼): 直接
-
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ù)
-
使用JSON解析工具分析廣告展示所需數(shù)據(jù)(
w_picurl , ori_curl , w , h
)
-
-
廣告界面效果圖
-
廣告功能界面實現(xiàn)步驟
- 1.設(shè)置廣告界面啟動背景圖片,
根據(jù)屏幕的高度做啟動背景圖片屏幕適配
- 2.請求廣告數(shù)據(jù)
- 1.創(chuàng)建請求回話管理者
- 設(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.
- 1.設(shè)置廣告界面啟動背景圖片,
判斷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]];
}
}
-
廣告界面效果圖
跳過按鈕注意點
- 按鈕如果是
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)入第三份框架