iOS Developer

QLPreviewController使用方法

2018-04-11  本文已影响481人  iOS程序媛ff

在iOS SDK包括了QLPreviewControllerAPI在[iOS]中用于方便预览文件,它支持的文件有:

使用的时候首先要引用#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"]);
    }
}

刚刚接触这块,如有错误,也请指出,谢谢!

上一篇 下一篇

猜你喜欢

热点阅读