1.#define MAS_SHORTHAND_GLOBALS
#import <Masonry.h>(在pch文件里引入的头文件)
Masonry用于对控件的约束。在切换横竖屏的时候能够保证可见的在固定的位置显示。不会因为切换的时候就变了位置。保证了所要达到的效果。
2.SDWebImage(简化网络图片处理)不用再多写NSURL *url = [NSURL URLWithString:所存的路径,网址,点语法是因为定义了一个分类,在分类中定义了一个只读的属性,可以更简单的调用。
#import <UIImageView+WebCache.h>(在pch文件里引入的头文件)
[cell.iconIV sd_setImageWithURL:model.roomSrc.yx_URL placeholderImage:[UIImage imageNamed:@"AV_slider_thumb1"]];
3.#import <MJRefresh.h>(在pch文件里引入的头文件)
上拉刷新下拉刷新
MJRefresh的脚步刷新分两种
autoNormal(不隐藏脚部文字) 和 backNormal(隐藏脚部文字)
上拉刷新:
self.collectionView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
//下拉刷新操作, 一定请求的是从0开始
[NetManager getLive:_dataModel.cateId offset:0 completionHandler:^(LiveModel *liveModel, NSError *error) {
[self.collectionView.mj_header endRefreshing];
if (error) {
NSLog(@"%@", error);
}else{
//_liveModel = liveModel;
//刷新操作, 清空原有的数据
[self.dataList removeAllObjects];
//addObjectsFromArray:从另一个数组中吧所有元素加到其他数组里
[self.dataList addObjectsFromArray:liveModel.data];
_offset = self.dataList.count;
[self.collectionView reloadData];
//下拉操作也要做是否有更多数据的判断
if (liveModel.data.count == kLiveLimit) {
[self.collectionView.mj_footer resetNoMoreData];
}else{
[self.collectionView.mj_footer endRefreshingWithNoMoreData];
}
}
}];
}];
[self.collectionView.mj_header beginRefreshing];
下拉刷新:
self.collectionView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingBlock:^{
[NetManager getLive:_dataModel.cateId offset:_offset completionHandler:^(LiveModel *liveModel, NSError *error) {
if (error) {
NSLog(@"error %@", error);
}else{
[self.dataList addObjectsFromArray:liveModel.data];
_offset = self.dataList.count;
[self.collectionView reloadData];
//判断返回数据的数量等于20,说明可能还有数据
if (liveModel.data.count == kLiveLimit) {
[self.collectionView.mj_footer endRefreshing];
}else{ //没有更多数据
[self.collectionView.mj_footer endRefreshingWithNoMoreData
4.#import <MLTransition.h>(在pch文件里引入的头文件)
//解决iOS7右划返回失效问题, 这个是因为自定义导航栏返回按钮导致的
[MLTransition validatePanBackWithMLTransitionGestureRecognizerType:MLTransitionGestureRecognizerTypeScreenEdgePan];
5.#import <MBProgressHUD.h>(在pch文件里引入的头文件)
//如果当前无网络, 则提示用户 没有网络
if (!kAppDelegate.isOnLine) {
[kAppDelegate.window showWarning:@"当前没有网络!"];
- (void)showWarning:(NSString *)msg{
//为了保证线程安全:例如调用此方法的人是在子线程中调用的.
dispatch_async(dispatch_get_main_queue(), ^{
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self animated:YES];
hud.mode = MBProgressHUDModeText;
hud.labelText = msg;
[hud hide:YES afterDelay:kAlertDuration];
});
}
6.#import <CocoaLumberjack.h> (在pch文件里引入的头文件)
替换NSLog
在pch文件里宏定义
#ifdef DEBUG //开发阶段
static const int ddLogLevel = DDLogLevelVerbose;
#else
static const int ddLogLevel = DDLogLevelError;
#endif
//注册DDLog(当然注册的时候是在AppDelegate自定义分类的一个自定义的方法中注册的)
[DDLog addLogger:[DDASLLogger sharedInstance]];
[DDLog addLogger:[DDTTYLogger sharedInstance]];
[[DDTTYLogger sharedInstance] setColorsEnabled:YES];
cocoaLumberjack
解决问题: NSLog本身打印十分消耗资源, 并且没有分级打印功能.
比如: 只打印警告, 只打印普通信息等等
调试的时候打印, 发布上架之后不打印
7.把系统原生的target+Selector, delegate方式 转化为block方式
#import <BlocksKit.h>(在pch文件里引入的头文件)
#import <BlocksKit+UIKit.h>(在pch文件里引入的头文件)
#import <BlocksKit+MessageUI.h>(在pch文件里引入的头文件)
UIBarButtonItem *backItem = [[UIBarButtonItem alloc] bk_initWithTitle:@"返回" style:UIBarButtonItemStyleDone handler:^(id sender) {
[self.navigationController popViewControllerAnimated:YES];
}];
8.#import <NSObject+YYModel.h> (在pch文件里引入的头文件)
为解析网络上获取的数据提供更简便的方法
判断如果有数组的要进行解析
+ (NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass
判断如果有key被替换的 return @{@"cateId" : @"cate_id”};用前面的替换后面的
+(NSDictionary<NSString *,id> *)modelCustomPropertyMapper
9.#import <AFNetworking.h>(在pch文件里引入的头文件)
对网络上的数据进行解析。
接口:
+(id)GET:(NSString *)path parameters:(NSDictionary *)parameters progress:(void(^)(NSProgress *progress))downloadProgress completionHandler:(void(^)(id jsonObj,NSError *error))completionHandler;
+(id)POST:(NSString *)path parameters:(NSDictionary *)parameters progress:(void(^)(NSProgress *progress))downloadProgress completionHandler:(void(^)(id jsonObj,NSError *error))completionHandler;
方法的实现:
+(id)GET:(NSString *)path parameters:(NSDictionary *)parameters progress:(void (^)(NSProgress *))downloadProgress completionHandler:(void (^)(id, NSError *))completionHandler{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer.timeoutInterval = 30;
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/plain", @"text/html", @"text/javascript", nil];
return [manager GET:path parameters:parameters progress:downloadProgress success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
!completionHandler ?: completionHandler(responseObject,nil);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
!completionHandler ?: completionHandler(nil,error);
}];
}
+(id)POST:(NSString *)path parameters:(NSDictionary *)parameters progress:(void (^)(NSProgress *))downloadProgress completionHandler:(void (^)(id, NSError *))completionHandler{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer.timeoutInterval = 30;
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/plain", @"text/html", @"text/javascript", nil];
return [manager GET:path parameters:parameters progress:downloadProgress success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
!completionHandler ?: completionHandler(responseObject,nil);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
!completionHandler ?: completionHandler(nil,error);
}];
}