UI一揽子计划 20 (豆瓣实战之图片缓存 、豆瓣实战之详情界面(自适应行高) 、豆瓣实战之登陆注销、刘新林分享之UIAlertController)
2015-09-18 10:57
239 查看
一.图片缓存
ActivityModel.m
如果数据加载完毕就将图片放到缓存中.
#pragma mark -- imageDownLoader
代理方法
//
成功返回data
- (void)imageDownSucceedWithData:(NSData
*)data
{
//
给model里的图片
赋值
self.getUrlImage
= [UIImage
imageWithData:data];
//
标识加载完毕
_isDownloading
=
NO;
//
图片缓存
FileManager
*manager = [FileManager
shareManager];
[manager
saveImageData:data
imageURl:self.image];
}
在给model对象赋值的时候, 用的是KVC 方法,其实内部调用的是setValue forKey 的方法.所以就改写里面的方法,如果缓存区里有图片就不从网上download,直接从缓存路径下面去读取图片.
读缓存的思路
1. 图片显示在cell
上,需要看显示图片的方法
2. 当model
中的getUrlImage为空的时候是去请求图片的,
3. 现在需要加载缓存.
4. 不请求
就是model
中的getUrlImage
不为空
5. 如果给
getUrlImage
赋值 缓存中的图片
就
达到目的了
6. 新问题:
如何给
getUrlImage 赋值
缓存中的图片?
7. 利用图片的
网址
可以找到对应的缓存图片
8. 如何在一开始赋值的时候
就把缓存中的图片赋值model
9.
一开始的赋值
在setValue ForKey
方法中
//setValueforkeywithDictionary:Dic
实际上多次调用下面的方法
- (void)setValue:(id)value
forKey:(NSString
*)key
{
[super
setValue:value
forKey:key];
if([key
isEqualToString:@"image"])
{
//
这时
value
就是图片的网址
self.image
= value;
//
给self.getUrlImage
加载缓存
self.imagePath
= [[FileManager
shareManager]
imagesPathWithImageUrl:self.image];
self.getUrlImage
= [UIImage
imageWithContentsOfFile:self.imagePath];
}
}
FileManager.h
#import
<Foundation/Foundation.h>
@interface
FileManager :
NSObject
+ (FileManager
*)shareManager;
- (void)saveImageData:(NSData
*)imageData imageURl:(NSString
*)imageUrl;
//
传url
返回一个URL
完整路径
- (NSString
*)imagesPathWithImageUrl:(NSString
*)imageUrl;
@end
FileManager.m
#import
"FileManager.h"
@implementation
FileManager
+ (FileManager
*)shareManager
{
static
FileManager
*manager =
nil;
if
(manager ==
nil) {
manager = [[FileManager
alloc]init];
}
return
manager;
}
// 1.
把文件夹创建在沙盒的缓存文件夹里
// 2.
需要把图片的网址变成图片名字
然后拼接成地址
// 3.
把图片写进文件
按完整地址(文件夹
+
名字)
//
返回cache文件夹的路径
- (NSString
*)cachesPath
{
NSString
*cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
NSUserDomainMask,
YES)
firstObject];
NSLog(@"%@",
cachePath);
return
cachePath;
}
//
在cache文件夹下创建一个ImageDownload文件夹
- (NSString
*)createImageDownloadFile
{
NSString
*imageDownloadPath = [[self
cachesPath]
stringByAppendingPathComponent:@"ImageDownload"];
NSFileManager
*manager = [NSFileManager
defaultManager];
//
判断文件夹是否存在
if
([manager
isExecutableFileAtPath:imageDownloadPath] ==
NO) {
//
文件夹不存在
就创建一个
[manager
createDirectoryAtPath:imageDownloadPath
withIntermediateDirectories:YES
attributes:nil
error:nil];
}
return
imageDownloadPath;
}
//
图片的路径
需要图片的网址
和
文件夹的路径
- (NSString
*)imagesPathWithImageUrl:(NSString
*)imageUrl
{
//
转换图片的名字
把"/"转换成"_"
NSString
*imageName = [imageUrl
stringByReplacingOccurrencesOfString:@"/"
withString:@"_"];
//
拼接完整的路径
NSString
*imagePath = [[self
createImageDownloadFile]
stringByAppendingPathComponent:imageName];
return
imagePath;
}
//
利用路径保存图片的data
- (void)saveImageData:(NSData
*)imageData imageURl:(NSString
*)imageUrl
{
//
保存的前提是要有文件夹
//NSString *imageDownloadPath = [self createImageDownloadFile];
//
得到图片的路径
NSString
*imagePath = [self
imagesPathWithImageUrl:imageUrl];
//
写文件
[imageData
writeToFile:imagePath
atomically:YES];
}
@end
详情界面中加载图片的方法(两种情况)
1. 如果图片加载出来了,就把model的图片属性传过来
2. 如果图片还没有加载出来 model的图片属性为空 那么就设置观察者模式 观察这个图片属性 如果图片加载出来 就给图片赋值
//活动图片
if
(self.model.getUrlImage
==
nil) {
//没有图像,下载图像
view.activityImageView.image
= [UIImage
imageNamed:@"picholder"];
[self.model
imageDownload];
//
添加一个观察者来观察图片是否已经加载出来了
[self.model
addObserver:self
forKeyPath:@"getUrlImage"
options:NSKeyValueObservingOptionNew
context:nil];
}else{
view.activityImageView.image
=
self.model.getUrlImage;
}
//添加观察者
- (void)observeValueForKeyPath:(NSString
*)keyPath ofObject:(id)object
change:(NSDictionary
*)change context:(void
*)context
{
ActivityDetailView
*view = (ActivityDetailView
*)self.view;
UIImage
*image = [change
objectForKey:NSKeyValueChangeNewKey];
view.activityImageView.image
= image;
}
二.详情界面
详情界面中对scrollView 自适应行高
- (void)adjustSubviewsWithContent:(NSString
*)content
{
//计算活动内容的高度
CGRect
frame = [content
boundingRectWithSize:CGSizeMake(_titleLabel.width,
10000000)
options:(NSStringDrawingUsesLineFragmentOrigin)
attributes:[NSDictionary
dictionaryWithObject:[UIFont
systemFontOfSize:12]
forKey:NSFontAttributeName]
context:nil];
//
更改label的高度
然后再更改
scrollView的高度
显示滑动范围
_contextLabel.height
= frame.size.height;
_bottomScrollView.contentSize
=
CGSizeMake(kScreenWidth,
_contextLabel.bottom
+
20);
}
三.登陆注销
UserManager.h
#import
<Foundation/Foundation.h>
@interface
UserManager :
NSObject
+(UserManager
*)shareUserManager;
//
传进来一个账号
把账号持久化
- (void)userName:(NSString
*)userName;
//
返回账号信息
- (NSString
*)userName;
- (void)password:(NSString
*)passord;
- (NSString
*)password;
- (void)isLogin:(BOOL)isLogin;
- (BOOL)isLogin;
@end
UserManager.m
#import
"UserManager.h"
@implementation
UserManager
+(UserManager
*)shareUserManager
{
static
UserManager
*manager =
nil;
if
(manager ==
nil) {
manager = [[UserManager
alloc]init];
}
return
manager;
}
//
传进来一个账号
把账号持久化
- (void)userName:(NSString
*)userName
{
NSUserDefaults
*userDefaults = [NSUserDefaults
standardUserDefaults];
[userDefaults
setObject:userName
forKey:kUserName];
//
同步数据
[userDefaults
synchronize];
}
//
返回账号信息
- (NSString
*)userName
{
NSUserDefaults
*userDefaults = [NSUserDefaults
standardUserDefaults];
return
[userDefaults
objectForKey:kUserName];
}
- (void)password:(NSString
*)passord
{
[[NSUserDefaults
standardUserDefaults]
setObject:passord
forKey:kPassword];
[[NSUserDefaults
standardUserDefaults]
synchronize];
}
- (NSString
*)password
{
return
[[NSUserDefaults
standardUserDefaults]
objectForKey:kPassword];
}
- (void)isLogin:(BOOL)isLogin
{
[[NSUserDefaults
standardUserDefaults]
setBool:isLogin
forKey:kLoginState];
[[NSUserDefaults
standardUserDefaults]synchronize];
}
- (BOOL)isLogin
{
return
[[NSUserDefaults
standardUserDefaults]boolForKey:kLoginState];
}
@end
四.UIAlertController
- (void)viewDidLoad
{
[super
viewDidLoad];
UIButton
*button = [UIButton
buttonWithType:(UIButtonTypeCustom)];
button.frame
=
CGRectMake(100,
100,
100,
100);
[button
setTitle:@"点击"
forState:(UIControlStateNormal)];
button.backgroundColor
= [UIColor
redColor];
[button
addTarget:self
action:@selector(action:)
forControlEvents:(UIControlEventTouchUpInside)];
[self.view
addSubview:button];
}
- (void)action:(UIButton
*)button
{
UIAlertController
*alertVC = [UIAlertController
alertControllerWithTitle:@"提示"
message:@"我是alert框"
preferredStyle:(UIAlertControllerStyleAlert)];
//
创建一个按钮
// handler
处理点击事件
UIAlertAction
*okAction = [UIAlertAction
actionWithTitle:@"确定"
style:(UIAlertActionStyleDefault)
handler:^(UIAlertAction
*action) {
// block
回调
NSLog(@"%@",action.title);
}];
UIAlertAction
*cancelAction = [UIAlertAction
actionWithTitle:@"取消"
style:(UIAlertActionStyleCancel)
handler:^(UIAlertAction
*action) {
// block
回调
NSLog(@"%@",action.title);
}];
[alertVC
addAction:okAction];
[alertVC
addAction:cancelAction];
[alertVC
addTextFieldWithConfigurationHandler:^(UITextField
*textField) {
textField.text
=
@"wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww";
}];
NSArray
*textFieldArray = alertVC.textFields;
NSLog(@"%@",
textFieldArray[0]); // 数组里面存放的是字典
/
<_UIAlertControllerTextField: 0x7f986a8365a0; frame = (0 0; 0 0); text = 'wwwwwwwwwwwwwwwwwwwwwwwww...'; clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x7f98684485f0>>/
[self
presentViewController:alertVC
animated:YES
completion:nil];
}
ActivityModel.m
如果数据加载完毕就将图片放到缓存中.
#pragma mark -- imageDownLoader
代理方法
//
成功返回data
- (void)imageDownSucceedWithData:(NSData
*)data
{
//
给model里的图片
赋值
self.getUrlImage
= [UIImage
imageWithData:data];
//
标识加载完毕
_isDownloading
=
NO;
//
图片缓存
FileManager
*manager = [FileManager
shareManager];
[manager
saveImageData:data
imageURl:self.image];
}
在给model对象赋值的时候, 用的是KVC 方法,其实内部调用的是setValue forKey 的方法.所以就改写里面的方法,如果缓存区里有图片就不从网上download,直接从缓存路径下面去读取图片.
读缓存的思路
1. 图片显示在cell
上,需要看显示图片的方法
2. 当model
中的getUrlImage为空的时候是去请求图片的,
3. 现在需要加载缓存.
4. 不请求
就是model
中的getUrlImage
不为空
5. 如果给
getUrlImage
赋值 缓存中的图片
就
达到目的了
6. 新问题:
如何给
getUrlImage 赋值
缓存中的图片?
7. 利用图片的
网址
可以找到对应的缓存图片
8. 如何在一开始赋值的时候
就把缓存中的图片赋值model
9.
一开始的赋值
在setValue ForKey
方法中
//setValueforkeywithDictionary:Dic
实际上多次调用下面的方法
- (void)setValue:(id)value
forKey:(NSString
*)key
{
[super
setValue:value
forKey:key];
if([key
isEqualToString:@"image"])
{
//
这时
value
就是图片的网址
self.image
= value;
//
给self.getUrlImage
加载缓存
self.imagePath
= [[FileManager
shareManager]
imagesPathWithImageUrl:self.image];
self.getUrlImage
= [UIImage
imageWithContentsOfFile:self.imagePath];
}
}
FileManager.h
#import
<Foundation/Foundation.h>
@interface
FileManager :
NSObject
+ (FileManager
*)shareManager;
- (void)saveImageData:(NSData
*)imageData imageURl:(NSString
*)imageUrl;
//
传url
返回一个URL
完整路径
- (NSString
*)imagesPathWithImageUrl:(NSString
*)imageUrl;
@end
FileManager.m
#import
"FileManager.h"
@implementation
FileManager
+ (FileManager
*)shareManager
{
static
FileManager
*manager =
nil;
if
(manager ==
nil) {
manager = [[FileManager
alloc]init];
}
return
manager;
}
// 1.
把文件夹创建在沙盒的缓存文件夹里
// 2.
需要把图片的网址变成图片名字
然后拼接成地址
// 3.
把图片写进文件
按完整地址(文件夹
+
名字)
//
返回cache文件夹的路径
- (NSString
*)cachesPath
{
NSString
*cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
NSUserDomainMask,
YES)
firstObject];
NSLog(@"%@",
cachePath);
return
cachePath;
}
//
在cache文件夹下创建一个ImageDownload文件夹
- (NSString
*)createImageDownloadFile
{
NSString
*imageDownloadPath = [[self
cachesPath]
stringByAppendingPathComponent:@"ImageDownload"];
NSFileManager
*manager = [NSFileManager
defaultManager];
//
判断文件夹是否存在
if
([manager
isExecutableFileAtPath:imageDownloadPath] ==
NO) {
//
文件夹不存在
就创建一个
[manager
createDirectoryAtPath:imageDownloadPath
withIntermediateDirectories:YES
attributes:nil
error:nil];
}
return
imageDownloadPath;
}
//
图片的路径
需要图片的网址
和
文件夹的路径
- (NSString
*)imagesPathWithImageUrl:(NSString
*)imageUrl
{
//
转换图片的名字
把"/"转换成"_"
NSString
*imageName = [imageUrl
stringByReplacingOccurrencesOfString:@"/"
withString:@"_"];
//
拼接完整的路径
NSString
*imagePath = [[self
createImageDownloadFile]
stringByAppendingPathComponent:imageName];
return
imagePath;
}
//
利用路径保存图片的data
- (void)saveImageData:(NSData
*)imageData imageURl:(NSString
*)imageUrl
{
//
保存的前提是要有文件夹
//NSString *imageDownloadPath = [self createImageDownloadFile];
//
得到图片的路径
NSString
*imagePath = [self
imagesPathWithImageUrl:imageUrl];
//
写文件
[imageData
writeToFile:imagePath
atomically:YES];
}
@end
详情界面中加载图片的方法(两种情况)
1. 如果图片加载出来了,就把model的图片属性传过来
2. 如果图片还没有加载出来 model的图片属性为空 那么就设置观察者模式 观察这个图片属性 如果图片加载出来 就给图片赋值
//活动图片
if
(self.model.getUrlImage
==
nil) {
//没有图像,下载图像
view.activityImageView.image
= [UIImage
imageNamed:@"picholder"];
[self.model
imageDownload];
//
添加一个观察者来观察图片是否已经加载出来了
[self.model
addObserver:self
forKeyPath:@"getUrlImage"
options:NSKeyValueObservingOptionNew
context:nil];
}else{
view.activityImageView.image
=
self.model.getUrlImage;
}
//添加观察者
- (void)observeValueForKeyPath:(NSString
*)keyPath ofObject:(id)object
change:(NSDictionary
*)change context:(void
*)context
{
ActivityDetailView
*view = (ActivityDetailView
*)self.view;
UIImage
*image = [change
objectForKey:NSKeyValueChangeNewKey];
view.activityImageView.image
= image;
}
二.详情界面
详情界面中对scrollView 自适应行高
- (void)adjustSubviewsWithContent:(NSString
*)content
{
//计算活动内容的高度
CGRect
frame = [content
boundingRectWithSize:CGSizeMake(_titleLabel.width,
10000000)
options:(NSStringDrawingUsesLineFragmentOrigin)
attributes:[NSDictionary
dictionaryWithObject:[UIFont
systemFontOfSize:12]
forKey:NSFontAttributeName]
context:nil];
//
更改label的高度
然后再更改
scrollView的高度
显示滑动范围
_contextLabel.height
= frame.size.height;
_bottomScrollView.contentSize
=
CGSizeMake(kScreenWidth,
_contextLabel.bottom
+
20);
}
三.登陆注销
UserManager.h
#import
<Foundation/Foundation.h>
@interface
UserManager :
NSObject
+(UserManager
*)shareUserManager;
//
传进来一个账号
把账号持久化
- (void)userName:(NSString
*)userName;
//
返回账号信息
- (NSString
*)userName;
- (void)password:(NSString
*)passord;
- (NSString
*)password;
- (void)isLogin:(BOOL)isLogin;
- (BOOL)isLogin;
@end
UserManager.m
#import
"UserManager.h"
@implementation
UserManager
+(UserManager
*)shareUserManager
{
static
UserManager
*manager =
nil;
if
(manager ==
nil) {
manager = [[UserManager
alloc]init];
}
return
manager;
}
//
传进来一个账号
把账号持久化
- (void)userName:(NSString
*)userName
{
NSUserDefaults
*userDefaults = [NSUserDefaults
standardUserDefaults];
[userDefaults
setObject:userName
forKey:kUserName];
//
同步数据
[userDefaults
synchronize];
}
//
返回账号信息
- (NSString
*)userName
{
NSUserDefaults
*userDefaults = [NSUserDefaults
standardUserDefaults];
return
[userDefaults
objectForKey:kUserName];
}
- (void)password:(NSString
*)passord
{
[[NSUserDefaults
standardUserDefaults]
setObject:passord
forKey:kPassword];
[[NSUserDefaults
standardUserDefaults]
synchronize];
}
- (NSString
*)password
{
return
[[NSUserDefaults
standardUserDefaults]
objectForKey:kPassword];
}
- (void)isLogin:(BOOL)isLogin
{
[[NSUserDefaults
standardUserDefaults]
setBool:isLogin
forKey:kLoginState];
[[NSUserDefaults
standardUserDefaults]synchronize];
}
- (BOOL)isLogin
{
return
[[NSUserDefaults
standardUserDefaults]boolForKey:kLoginState];
}
@end
四.UIAlertController
- (void)viewDidLoad
{
[super
viewDidLoad];
UIButton
*button = [UIButton
buttonWithType:(UIButtonTypeCustom)];
button.frame
=
CGRectMake(100,
100,
100,
100);
[button
setTitle:@"点击"
forState:(UIControlStateNormal)];
button.backgroundColor
= [UIColor
redColor];
[button
addTarget:self
action:@selector(action:)
forControlEvents:(UIControlEventTouchUpInside)];
[self.view
addSubview:button];
}
- (void)action:(UIButton
*)button
{
UIAlertController
*alertVC = [UIAlertController
alertControllerWithTitle:@"提示"
message:@"我是alert框"
preferredStyle:(UIAlertControllerStyleAlert)];
//
创建一个按钮
// handler
处理点击事件
UIAlertAction
*okAction = [UIAlertAction
actionWithTitle:@"确定"
style:(UIAlertActionStyleDefault)
handler:^(UIAlertAction
*action) {
// block
回调
NSLog(@"%@",action.title);
}];
UIAlertAction
*cancelAction = [UIAlertAction
actionWithTitle:@"取消"
style:(UIAlertActionStyleCancel)
handler:^(UIAlertAction
*action) {
// block
回调
NSLog(@"%@",action.title);
}];
[alertVC
addAction:okAction];
[alertVC
addAction:cancelAction];
[alertVC
addTextFieldWithConfigurationHandler:^(UITextField
*textField) {
textField.text
=
@"wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww";
}];
NSArray
*textFieldArray = alertVC.textFields;
NSLog(@"%@",
textFieldArray[0]); // 数组里面存放的是字典
/
<_UIAlertControllerTextField: 0x7f986a8365a0; frame = (0 0; 0 0); text = 'wwwwwwwwwwwwwwwwwwwwwwwww...'; clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x7f98684485f0>>/
[self
presentViewController:alertVC
animated:YES
completion:nil];
}
相关文章推荐
- UI一揽子计划 19 (数据库管理系统、SQL语句、iOS 的数据库实现技术)
- UI一揽子计划 18 (沙盒机制、简单对象写入文件、NSFileMange、复杂对象写入文件)
- UI一揽子计划 17 (image的异步加载、KVO观察者模式、KVO进行豆瓣列表界面图片的异步加载)
- 201509181046_《css3——media query整理》
- 隐藏系统的uitabbar
- iOS UIView layoutSubviews调用时机
- 关于UIStoreBoard的Top space to:Top Layout Guide
- UILabel自动换行
- vickate _触摸事件处理 实现UIView替代UIButton
- DedeCMS Error: (PHP 5.3 and above) Please set request_order
- POJ 1947 Rebuilding Roads (树形DP)
- Xcode7 *** does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE)
- MessageQueue.IdleHandler接口使用方法以及原理分析
- 非静态的字段、方法或属性“System.Web.UI.Page.ClientScript...”要求对象引用 (封装注册脚本)
- easyUi datagrid实时刷新的闪屏问题
- 我收集了多个android界面UI效果,深感大哥们的分享啊
- 点击页面,UINavigationController导航栏的隐藏和显示
- Android进阶之动态加载图片(runOnUiThread/handler)
- 【设计模式】-建造者模式-Builder
- Android异步更新UI的方式之使用Handler的post(Runnabel r)方法