在iOS SDK包括了QLPreviewController
API在[iOS]中用于方便预览文件,它支持的文件有:
- iWork文档
- 微软Office97以上版本的文档
- RTF文档
- PDF文件
- 图片文件
- 文本文件和CSV文件
使用的时候首先要引用#import
。#import <QuickLook/QuickLook.h>
QLPreviewController类似于Tableview的使用方法,也是首先遵循代理和数据源代理。然后实现代理方法,<QLPreviewControllerDataSource,QLPreviewControllerDelegate>
我返回的PreviewItems的数量为1,就是一次加载一个文件,这里可以是多个文件的数组个数,也就是某个本地路径下的多个文件,但是return 不能直接写等于1 ,这样会没有效果,应该写self.arr.count;大家可以自己实现下。
-(NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller{
return 1;
}
返回的当前预览的文件QLPreviewItem,controller:当前预览控制器,index:当前预览的第几个文件。
- (id)previewController:(QLPreviewController *)previewController previewItemAtIndex:(NSInteger)idx{
ContractDetailModel *modelNew = _arr[idx];
return [NSURL fileURLWithPath:[self getApplicationDocumentsDirectory:modelNew]];
}
这里为什么返回Url呢,进入QLPreviewItem头文件你就会明白了:
QL_EXPORT @protocol QLPreviewItem <NSObject>
@required
/*!
* @abstract The URL of the item to preview.
* @discussion The URL must be a file URL.
*/
@property(readonly, nonnull, nonatomic) NSURL * previewItemURL;
@optional
/*!
* @abstract The item's title this will be used as apparent item title.
* @discussion The title replaces the default item display name. This property is optional.
*/
@property(readonly, nullable, nonatomic) NSString * previewItemTitle;
@end
/*!
* @abstract This category makes NSURL instances as suitable items for the Preview Controller.
*/
@interface NSURL (QLPreviewConvenienceAdditions) <QLPreviewItem>
QLPreviewControlle其他的一些方法
/*!
* @abstract Returns YES if QLPreviewController can display this preview item.摘要返回YES如果QLPreviewController能显示预览项目。
*/
+ (BOOL)canPreviewItem:(id <QLPreviewItem>)item;
/*
* Acessing the previewed items*数据预览项目
*/
/*!
* @abstract The Preview Panel data source.抽象预览面板数据源。
*/
@property(nonatomic, weak, nullable) id <QLPreviewControllerDataSource> dataSource;
/*!
* @abstract Asks the Preview Controller to reload its data from its data source.抽象要求预览控制器从其数据源重新加载数据。
* @discussion This method does not refresh the visible item if it has not changed.刷新可见项,。
*/
- (void)reloadData;
/*!
* @abstract Asks the Preview Controller to recompute the preview of the currently previewed item.刷新当前预览项目。
*/
- (void)refreshCurrentPreviewItem;
/*!
* @abstract The index of the currently previewed item in the preview panel or NSNotFound if there is none.当前预览项目的下标。
*/
@property NSInteger currentPreviewItemIndex;
/*!
* @abstract The currently previewed item in the preview panel or nil if there is none.当前预览项目。
*/
@property(readonly, nullable) id <QLPreviewItem> currentPreviewItem;
监听滑到的是第几个浏览项目,做出相应的操作
如下是改变了title
[self.previewController addObserver:self forKeyPath:@"currentPreviewItemIndex" options:
NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
//keyPath:属性名称
//object:被观察的对象
//change:变化前后的值都存储在 change 字典中
//context:注册观察者时,context 传过来的值
/* 2.只要object的keyPath属性发生变化,就会调用此回调方法,进行相应的处理:UI更新:*/
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary<NSString *,id> *)change context:(void *)context{
// 判断是否为self.myKVO的属性“num”:
if([keyPath isEqualToString:@"currentPreviewItemIndex"] && object == self.previewController) {
// 响应变化处理:UI更新(label文本改变)
NSString *num = [NSString stringWithFormat:@"%@",
[change valueForKey:@"new"]];
NSInteger number = [num integerValue];
ContractDetailModel *model = _arr[number];
if ([model.agreementType isEqualToString:@"0"] ) {
self.title = @"title1";
} else if ([model.agreementType isEqualToString:@"1"]){
self.title = @"title2";
}
if ([num isEqualToString:@"0"]) {
[self.firstImg setImage:[UIImage imageNamed:@"Oval91"]];
[self.secsonImg setImage:[UIImage imageNamed:@"Oval92"]];
} else if ([num isEqualToString:@"1"]) {
[self.firstImg setImage:[UIImage imageNamed:@"Oval92"]];
[self.secsonImg setImage:[UIImage imageNamed:@"Oval91"]];
}
//change的使用:上文注册时,枚举为2个,因此可以提取change字典中的新、旧值的这两个方法
NSLog(@"\\noldnum:%@ newnum:%@",[change valueForKey:@"old"],
[change valueForKey:@"new"]);
}
}
刚刚接触这块,如有错误,也请指出,谢谢!