10月26号整理
1.获得项目中info.plist文件的内容
1> [NSBundle mainBundle].infoDictionary
2> 版本号在info.plist中的key:kCFBundleVersionKey
2.自定义控制器的view
重写loadView方法(不需要调用[super loadView])
3.控制器view的高度和状态栏的关系
创建控制器的view时,系统会检测状态栏是否显示
* 如果有状态栏,那么控制器view的高度是460(iPhone5中是548)
* 如果没有状态栏,那么控制器view的高度是480(iPhone5中是568)
4.[UIScreen mainScreen].applicationFrame的取值
以3.5inch为例(320x480)
1> 没有状态栏,applicationFrame的值{{0, 0}, {320, 480}}
2> 有状态栏,applicationFrame的值{{0, 20}, {320, 460}}
5.按钮的状态
UIControlStateNormal 普通(默认的状态)
UIControlStateHighlighted 高亮(用户长按的时候)
UIControlStateDisabled 失效(通过代码控制:enabled属性)
UIControlStateSelected 选中(通过代码控制:selected属性)
6.错误调试技巧
1> 一个控件无法显示出来的可能原因
* 没有宽高(宽高为0)
* 位置不对
* hidden=YES
* 没有被addSubview到屏幕上
2> 一个UIScrollView无法滚动
* contentSize没有值
* 不能接收到触摸事件
3> 一个控件无法跟用户交互(无法接收事件)的可能原因
* (父控件的)userInteractionEnabled = NO;
* (父控件的)hidden = YES
* (父控件的)alpha <= 0.01
* (父控件的)背景是clearColor
7.按钮的设置
// 高亮状态下不更改图片的颜色
self.adjustsImageWhenHighlighted = NO;
// 是否选中状态
self.selected = YES;
// 是否可用状态
10月27号整理
一、按钮的设置
0.设置背景图片
[btn setBackgroundImage:image forState:UIControlStateNormal];
1.设置内部UIImageView的图片
[btn setImage:image forState:UIControlStateNormal];
// 不能写成btn.imageView.image = image;
2.设置内部UILabel的文字
[btn setTitle:@"43" forState:UIControlStateNormal];
// 不能写成btn.titleLabel.text = @"43";
3.调整内部ImageView的frame
- (CGRect)imageRectForContentRect:(CGRect)contentRect
4.调整内部UILabel的frame
- (CGRect)titleRectForContentRect:(CGRect)contentRect
5.覆盖父类在highlighted时的所有操作
- (void)setHighlighted:(BOOL)highlighted { }
6.文字居中
self.titleLabel.textAlignment = NSTextAlignmentCenter;
7.文字大小
self.titleLabel.font = [UIFont systemFontOfSize:12];
8.图片的内容模式
self.imageView.contentMode = UIViewContentModeCenter;
二、添加子控制器
- (void)addChildViewController:
* 会将子控制器添加到childViewControllers,并且子控制器是有顺序的
* 目的就是持有子控制器,不让子控制器销毁,保证主控制器在,子控制器就在
三、让一个控制器拥有导航栏的最快方法:包装一层导航控制器
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:controller];
四、UIBarButtonItem
1> 创建一个带有文字的item
[[UIBarButtonItem alloc] initWithTitle:@"设置" style:UIBarButtonItemStyleBordered target:nil action:nil]
2> 创建一个包装了自定义View的item
- (id)initWithCustomView:(UIView *)customView
五、设置导航栏UINavigationBar主题
// 1.appearance方法返回一个导航栏的外观对象
// 修改了这个外观对象,相当于修改了整个项目中的外观
UINavigationBar *bar = [UINavigationBar appearance];
// 2.设置导航栏的背景图片
[bar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
// 3.设置导航栏文字的主题
[bar setTitleTextAttributes:@{
UITextAttributeTextColor : [UIColor blackColor],
UITextAttributeTextShadowOffset : [NSValue valueWithUIOffset:UIOffsetZero]
}];
六、设置导航按钮UIBarButtonItem主题
// 1.修改所有UIBarButtonItem的外观
UIBarButtonItem *barItem = [UIBarButtonItem appearance];
// 2.修改item的背景图片
[barItem setBackgroundImage:image1 forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[barItem setBackgroundImage:image2 forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
// 3.修改item上面的文字样式
NSDictionary *dict = @{
UITextAttributeTextColor : [UIColor darkGrayColor],
UITextAttributeTextShadowOffset : [NSValue valueWithUIOffset:UIOffsetZero]
};
[barItem setTitleTextAttributes:dict forState:UIControlStateNormal];
[barItem setTitleTextAttributes:dict forState:UIControlStateHighlighted];
七、设置状态栏样式
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackOpaque;
10月29号整理
一、Cell的设置
1.设置cell的背景view和选中时的背景view
UIImageView *bg = [[UIImageView alloc] init];
bg.image = [UIImage imageNamed:@"abc.png"];
cell.backgroundView = bg;
UIImageView *selectedBg = [[UIImageView alloc] init];
selectedBg.image = [UIImage imageNamed:@"cde.png"];
cell.selectedBackgroundView = selectedBg;
2.设置cell最右边的指示器(比如箭头\文本标签)
cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"common_icon_arrow.png"]];
二、tableView的设置
1.设置table头部和底部的view
// 底部(宽度固定是320)
tableView.tableFooterView = footer;
// 头部(宽度固定是320)
tableView.tableHeaderView = header;
2.设置每一组头部和底部的高度
tableView.sectionHeaderHeight = 5;
tableView.sectionFooterHeight = 0;
3.设置tableView的背景
// 当tableview的样式为group时,如果想更换背景,必须清除默认条纹状的backgroundView
// backgroundView的优先级 > backgroundColor
tableView.backgroundView = nil;
tableView.backgroundColor = [UIColor redColor];
10月30号整理
一、AFN的使用
1.依赖的框架
* MobileCoreServices.framework
* SystemConfiguration.framework
* Security.framework
2.主头文件:AFNetworking.h
3.创建POST请求对象
// BaseURL是基准路径,格式为-> 协议头://主机名 ,不能包含其他路径
AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"https://api.weibo.com"]];
// Method是请求方法
// path是拼接在基准路径后面的请求路径
// parameters是POST请求的参数
NSURLRequest *post = [client requestWithMethod:@"POST" path:@"oauth2/access_token" parameters:@{
@"client_id" : kAppKey,
@"client_secret" : kAppSecret,
@"grant_type" : @"authorization_code",
@"redirect_uri" : kRedirectURI,
@"code" : requestToken
}];
4.发送请求,解析服务器的JSON数据
// 创建操作对象
NSOperation *op = [AFJSONRequestOperation JSONRequestOperationWithRequest:post
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
// AFN认为请求成功会调用
}
failure : ^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
// AFN认为请求失败会调用
}];
// 执行操作
[op start];
5.AFJSONRequestOperation默认不接收text/plain类型的数据,当服务器返回text/plain类型的数据时,会认为出错了。可以通过修改源代码解决问题
* 修改AFJSONRequestOperation的下列方法
+ (NSSet *)acceptableContentTypes {
return [NSSet setWithObjects:@"text/plain", @"application/json", @"text/json", @"text/javascript", nil];
}
二、MBProgressHUD的使用
1.显示HUD
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.labelText = @"哥正在加载中...";
hud.dimBackground = YES;
2.移除hud
[MBProgressHUD hideAllHUDsForView:self.view animated:YES];
三、工具类的作用
1.封装某一块独立的业务功能,比如存储数据、发送网络请求等
2.每个工具类的作用
* HttpTool:负责发送整个微博项目的get\post请求
* StatusTool:负责管理微博数据:抓取微博数据、发送微博
* AccountTool:负责管理账号(存储\读取账号)
10月1号
一、SDWebImage的使用
1.依赖的框架
* ImageIO.framework
* MapKit.framework
2.UIImageView下载图片需要的头文件:UIImageView+WebCache.h
3.调用方法下载图片
// url是图片路径
// placeholder是占位图片(正在下载图片时,暂时显示的图片)
// options是缓存策略
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options
4.缓存策略-SDWebImageOptions
默认是开启了硬盘\内存缓存的
* SDWebImageRetryFailed 下载失败了会再次尝试下载
* SDWebImageLowPriority 当UIScrollView等正在滚动时,延迟下载图片(放置scrollView滚动卡)
* SDWebImageCacheMemoryOnly 只缓存到内存中,不缓存到硬盘上
* SDWebImageProgressiveDownload 图片会一点一点慢慢显示出来(就像浏览器显示网页上的图片一样)
* SDWebImageRefreshCached 将硬盘缓存交给系统自带的NSURLCache去处理,当同一个URL对应的图片经常更改时可以用这种策略
一般使用SDWebImageRetryFailed | SDWebImageLowPriority
二、动态改变Cell的高度
1.利用tableView代理方法的返回值决定每一行cell的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
三、UIFont
// 返回字体的行高
* [UIFont systemFontOfSize:10].lineHeight
10月2号
一、每个Cell高度不一致的一般做法:
1.自定义一个cell,在initWithStyle:reuseIdentifier:构造方法中添加所有可能显示的子控件
2.新建一个模型类,比如StatusCellFrame,作用是:描述一个Cell内部所有子控件的frame属性
* 提供一系列CGRect类型的属性给Cell访问
* 提供一个接口来接收模型数据(比如Status)
* 在接收模型数据的同时,计算所有子控件的frame和cell的高度
3.回到控制器(代理和数据源)
1> 在tableView:heightForRowAtIndexPath:方法中利用StatusCellFrame返回cell的高度
2> 在tableView:cellForRowAtIndexPath:方法中
* 新建自定义cell
* 给Cell传递对应的StatusCellFrame对象
4. 自定义Cell
1> 提供接口接收StatusCellFrame对象
2> 在接收StatusCellFrame对象的同时,设置所有子控件的frame,设置所有子控件的数据
二、日期处理
1.将字符串转成NSDate
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *date = [fmt dateFromString:@"2013-08-08 17:45:34"];
2.将NSDate转为字符串
NSString *timeStr = [fmt stringFromDate:date];
10月4号
一、自动伸缩属性
UIViewAutoresizingNone 不伸缩
UIViewAutoresizingFlexibleLeftMargin 跟父控件左边的距离自动伸缩
UIViewAutoresizingFlexibleRightMargin 跟父控件右边的距离自动伸缩
UIViewAutoresizingFlexibleTopMargin 跟父控件顶部的距离自动伸缩
UIViewAutoresizingFlexibleBottomMargin 跟父控件底部的距离自动伸缩
UIViewAutoresizingFlexibleWidth 宽度跟随父控件宽度自动伸缩
UIViewAutoresizingFlexibleHeight 高度跟随父控件高度自动伸缩
二、设置按钮(UIButton)文字和图片的间距
@property(nonatomic) UIEdgeInsets titleEdgeInsets;
@property(nonatomic) UIEdgeInsets imageEdgeInsets;
三、新浪数据分页传递的参数
* since_id : 会加载 微博ID > since_id 的数据(也就是时间比较晚、比较新的数据)
* max_id : 会加载 微博ID <= max_id 的数据(也就是时间比较早、比较旧的数据)
四、MJRefresh的使用
0.先加入主头文件
#import "MJRefresh.h"
1.添加下拉刷新
MJRefreshHeaderView *header = [MJRefreshHeaderView header];
header.scrollView = self.tableView;
header.delegate = self;
2.添加上拉加载更多
MJRefreshFooterView *footer = [MJRefreshFooterView footer];
footer.scrollView = self.tableView;
footer.delegate = self;
3.监听刷新状态,有2种方式
1> 设置代理delegate,一旦控件进入了刷新状态,就会调用delegate的下列方法
- (void)refreshViewBeginRefreshing:(MJRefreshBaseView *)refreshView
{
if ([refreshView isKindOfClass:[MJRefreshFooterView class]]) {
// 上拉加载更多
} else {
// 下拉刷新
}
}
2> 设置block回调
header.beginRefreshingBlock = ^(MJRefreshBaseView *refreshView) {
};
footer.beginRefreshingBlock = ^(MJRefreshBaseView *refreshView) {
};
4.通过代码进入刷新状态
[header beginRefreshing]; // 进入刷新状态就会触发相应的代理方法或者block
[footer beginRefreshing]; // 进入刷新状态就会触发相应的代理方法或者block
5.结束刷新状态,回到普通状态
[header endRefreshing];
[footer endRefreshing];
6.可以在MJRefreshBaseView.h中通过控制NeedAudio宏来开启音频功能
7.在MJRefreshFooterView.m和MJRefreshHeaderView.m中可以修改控件显示的文字
五、如果想在内部限制某个控件的宽高,不让外界随便改,可以重写setFrame:方法,在此方法内部设置自己的宽高
10月5号
一、导航控制器的代理
1.UINavigationController的delegate属性
2.代理方法
1> 即将显示新控制器时调用
/*
navigationController : 导航控制器
viewController : 即将显示的新控制器
*/
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
2> 新控制器显示完毕时调用
/*
navigationController : 导航控制器
viewController : 显示完毕的新控制器
*/
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
二、隐藏控制器刚出现时的滚动条
重写控制器的viewDidAppear方法,覆盖父类默认的操作:显示滚动条
三、tableView每组的头部控件
1.控件宽度默认就是tableView的宽度
2.控件高度由下面的代理方法决定
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
四、通过tableView的代理方法控制某一行的cell能否达到高亮选中状态
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath