QLPreviewController的使用

QLPreviewController是<QuickLook/QuickLook.h>框架中的一个重要视图控制器,主要用于查看PDF、word文档、图片等。但是对于纯文本的TXT文档不适用。

QLPreviewController的使用方法这里不再赘述,网上挺多。但是有时候

QLPreviewController并不适合我们在工程中直接使用,他自带的导航栏我就不喜欢,那么我们就需要自己定制导航栏。但是在Apple提供的框架中并没有提供导航栏的自定制功能,想必小伙伴和我遇到了同样的困惑。

重点开始,目前我发现了两种比较靠谱的自定制的方法,现在分享给大家:

第一:

通过运行时,手动的添加Swizzing方法,交换系统原有的功能实现。在这个过程中你会发现,done按钮和分享按钮会被系统自动添加到setItems的数组中去,所以在(setRightBarButtonItems:animated:)方法中你设置一个按钮,实际上参数传过去两个按钮,这也就是为什么始终存在done和分享按钮的原因。

原因已经找出来了,那么现在我们就通过运行时交换成我们的实现就可以了。

- (void)override_setRightBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated
{
    if (item && [item.target isKindOfClass:[QLPreviewController class]] && item.action == @selector(actionButtonTapped:)){
        QLPreviewController *previewController = (QLPreviewController *)item.target;
        [self override_setRightBarButtonItem:previewController.navigationItem.rightBarButtonItem animated:animated];
    } else {
        [self override_setRightBarButtonItem:item animated:animated];
    }
}

- (void)override_setRightBarButtonItems:(NSArray *)items animated:(BOOL)animated
{
    if ([items count] == 0) {
        return;
    } else {
        UIBarButtonItem *firstItem = [items objectAtIndex:0];
        BOOL override = NO;
        if (firstItem && [firstItem.target isKindOfClass:[QLPreviewController class]] && firstItem.action == @selector(actionButtonTapped:)) {
            override = YES;
        }
        if (override) {
            QLPreviewController *previewController = (QLPreviewController *)firstItem.target;
            [self override_setRightBarButtonItems:previewController.navigationItem.rightBarButtonItems animated:animated];
        } else {
            [self override_setRightBarButtonItems:items animated:animated];
        }
    }
}

- (void)override_setLeftBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated
{
    if (item && [item.target isKindOfClass:[QLPreviewController class]] && item.action == @selector(doneButtonTapped:)){
        QLPreviewController *previewController = (QLPreviewController *)item.target;
        [self override_setLeftBarButtonItem:previewController.navigationItem.leftBarButtonItem animated:animated];
    } else {
        [self override_setLeftBarButtonItem:item animated:animated];
    }
}

- (void)override_setLeftBarButtonItems:(NSArray *)items animated:(BOOL)animated
{
    if ([items count] == 0) {
        return;
    } else {
        UIBarButtonItem *firstItem = [items objectAtIndex:0];
        BOOL override = NO;
        if (firstItem && [firstItem.target isKindOfClass:[QLPreviewController class]] && firstItem.action == @selector(doneButtonTapped:)) {
            override = YES;
        }
        if (override) {
            QLPreviewController *previewController = (QLPreviewController *)firstItem.target;
            previewController.navigationController.navigationBar.backgroundColor = [UIColor blackColor];
            [self override_setLeftBarButtonItems:previewController.navigationItem.leftBarButtonItems animated:animated];
        } else {
            [self override_setLeftBarButtonItems:items animated:animated];
        }
    }
}

void MethodSwizzle(Class class, SEL originalSEL, SEL overrideSEL)
{
    Method originalMethod = class_getInstanceMethod(class, originalSEL);
    Method overrideMethod = class_getInstanceMethod(class, overrideSEL);
    
    if (class_addMethod(class, originalSEL, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) {
        class_replaceMethod(class, overrideSEL, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, overrideMethod);
    }
}
+ (void)exchangeMethod
{
    MethodSwizzle(self, @selector(setRightBarButtonItem:animated:), @selector(override_setRightBarButtonItem:animated:));
    MethodSwizzle(self, @selector(setRightBarButtonItems:animated:), @selector(override_setRightBarButtonItems:animated:));
    MethodSwizzle(self, @selector(setLeftBarButtonItem:animated:), @selector(override_setLeftBarButtonItem:animated:));
    MethodSwizzle(self, @selector(setLeftBarButtonItems:animated:), @selector(override_setLeftBarButtonItems:animated:));
}

+ (void)noExchangeMethod
{
    MethodSwizzle(self, @selector(override_setRightBarButtonItem:animated:), @selector(setRightBarButtonItem:animated:));
    MethodSwizzle(self, @selector(override_setRightBarButtonItems:animated:), @selector(setRightBarButtonItems:animated:));
    MethodSwizzle(self, @selector(override_setLeftBarButtonItem:animated:), @selector(setLeftBarButtonItem:animated:));
    MethodSwizzle(self, @selector(override_setLeftBarButtonItems:animated:), @selector(setLeftBarButtonItems:animated:));
}
我们只需要,在加载前调用exchangeMethod方法即可,当页面退出,我们再将该方法交换回来就可以了。

第二种方法:

这种方法非常便捷,但是不建议使用。

直接将QLPreviewController的实例的视图当成子试图放入到另外一个控制器中。这样导航栏可以做到完全自定义。功能上没有影响。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值