美文网首页iOS开发iOS分享的demo图片选择
iOS图片浏览器 - XLPhotoBrowser(类似微信多图

iOS图片浏览器 - XLPhotoBrowser(类似微信多图

作者: shannoon | 来源:发表于2016-07-21 22:44 被阅读25444次

XLPhotoBrowser的GitHub链接
XLPhotoBrowser常见问题汇总

提示:最新使用教程请以GitHub链接为准,此文章不会每个版本都更新,有什么问题或者bug等可以在GitHub上提交issues

1.XLPhotoBrowser描述

一个简单实用的图片浏览器,效果类似微信图片浏览器,支持弹出动画和回缩动画,支持多图浏览,支持本地和网络图片浏览,支持多种属性自定义(支持横竖屏浏览)

支持多种图片浏览样式

  • 类似微信图片浏览样式XLPhotoBrowserStylePageControl , 底部有个pagecontrol显示图片索引
  • 类似微博图片浏览样式XLPhotoBrowserStyleIndexLabel , 上面有个UILabel显示图片索引
  • 简单样式XLPhotoBrowserStyleSimple , 上面有UILabel显示图片索引,左下部分有个保存按钮,可以保存当前图片
首页 XLPhotoBrowserStylePageControl XLPhotoBrowserStyleIndexLabel XLPhotoBrowserStyleSimple

支持长按手势弹出多功能选择框,类似微博微信中的效果

长按图片弹出多功能选择框

其他效果图:

XLPhotoBrowserDemo.gif XLPhotoBrowserDemo2.gif 横屏效果图

2. 安装方法

2.1 第一种方法: 使用cocoapods自动安装

pod 'XLPhotoBrowser+CoderXL'

2.2 第二种方法 :

  • 2.2.1 下载示例Demo
  • 2.2.2 把里面的XLPhotoBrowser文件夹拖到你的项目中(注意: 里面用到了一些第三方的类库,如果你的项目中已经使用了这些库,视情况删除)
  • 2.2.3 如果你的项目中没有用到SDWebImage框架,把图中SDWebImage文件夹也一起拖到你的工程中
Paste_Image.png

注意:

  • XLPhotoBrowser 1.2.0版本依赖于SDWebImage框架4.0.0版本,由于SDWebImage4.0版本对API进行了修改,所以不兼容SDWebImage4.0以下版本

3. 使用说明

3.1基本使用(提供2种传递数据的方法:图片以数组形式批量传递 和 数据源方法分开传递每一个位置的图片数据)

方法一:一行代码进入图片浏览器 在某些场景,例如只是想浏览一组本地/网络图片,你可以这样使用:
    // 传入图片数据源,直接进行图片浏览
    // 传入图片数据源数组self.images 可以是UIImage对象数组 ,可以是ALAsset对象, 也可以是图片的NSURL链接 , 或者是可以变成NSURL链接的NSString对象数组

    [XLPhotoBrowser showPhotoBrowserWithImages:self.images currentImageIndex:0];

方法二:如果上面直接提供图片数组的方式不适合,你可以考虑实现数据源方法,提供数据
  • 数据源方法提供了三个,不同的需求效果需要搭配不同的方法使用.根据每个方法的注释说明和项目的需求来决定具体要实现哪几个方法
/**
 进入图片浏览器
 */
- (void)clickImage:(UITapGestureRecognizer *)tap
{
    [XLPhotoBrowser showPhotoBrowserWithCurrentImageIndex:tap.view.tag imageCount:self.images.count datasource:self];
}

#pragma mark    -   XLPhotoBrowserDatasource

/**
 *  返回这个位置的占位图片 , 也可以是原图
 *  如果不实现此方法,会默认使用placeholderImage
 *
 *  @param browser 浏览器
 *  @param index   位置索引
 *
 *  @return 占位图片
 */
- (UIImage *)photoBrowser:(XLPhotoBrowser *)browser placeholderImageForIndex:(NSInteger)index
{
    return self.images[index];
}

/**
 *  返回指定位置图片的UIImageView,用于做图片浏览器弹出放大和消失回缩动画等
 *  如果没有实现这个方法,没有回缩动画,如果传过来的view不正确,可能会影响回缩动画效果
 *
 *  @param browser 浏览器
 *  @param index   位置索引
 *
 *  @return 展示图片的容器视图,如UIImageView等
 */
- (UIView *)photoBrowser:(XLPhotoBrowser *)browser sourceImageViewForIndex:(NSInteger)index
{
    return self.scrollView.subviews[index];
}

/**
 *  返回指定位置的高清图片URL
 *  如果你要显示更高质量的图片,可以通过这个方法传递网络/本地图片路径实现效果
 *
 *  @param browser 浏览器
 *  @param index   位置索引
 *
 *  @return 返回高清大图索引
 */
- (NSURL *)photoBrowser:(XLPhotoBrowser *)browser highQualityImageURLForIndex:(NSInteger)index
{
    return [NSURL URLWithString:self.urlStrings[index]];
}

ps:下面的示例代码中如非必要,统一用第一种方式传递图片数组来展示

3.2进阶使用说明(自定义多种属性等)

  • 如何进行网络图片浏览
    一行代码进入浏览,传递网络图片的地址数组进去即可
    // 1. NSURL数组
//    NSMutableArray *URLArray = [NSMutableArray array];
//    for (NSString *urlString in self.urlStrings) {
//        NSURL *URL = [NSURL URLWithString:urlString];
//        [URLArray addObject:URL];
//    }
//    [XLPhotoBrowser showPhotoBrowserWithImages:URLArray currentImageIndex:0];

    // 2.可以变成NSURL链接的NSString对象数组
    [XLPhotoBrowser showPhotoBrowserWithImages:self.urlStrings currentImageIndex:0];

或者用数据源方式,实现photoBrowser: highQualityImageURLForIndex:方法

- (void)clickImage:(UITapGestureRecognizer *)tap
{
    [XLPhotoBrowser showPhotoBrowserWithCurrentImageIndex:tap.view.tag imageCount:self.images.count datasource:self];
}

#pragma mark    -   XLPhotoBrowserDatasource

// 可以不实现此方法
- (UIImage *)photoBrowser:(XLPhotoBrowser *)browser placeholderImageForIndex:(NSInteger)index
{
    return self.images[index];
}

- (NSURL *)photoBrowser:(XLPhotoBrowser *)browser highQualityImageURLForIndex:(NSInteger)index
{
    return [NSURL URLWithString:self.urlStrings[index]];
}

  • 如何添加长按手势并自定义选择菜单
  • 获取XLPhotoBrowser实例对象,调用setActionSheetWithTitle:delegate:cancelButtonTitle:deleteButtonTitle:otherButtonTitles:方法
  • 同时在 XLPhotoBrowserDelegate代理方法中监听到用户的选择
/**
 *  浏览图片
 *
 */
- (void)clickImage:(UITapGestureRecognizer *)tap
{
    XLPhotoBrowser *browser = [XLPhotoBrowser showPhotoBrowserWithImages:self.images currentImageIndex:tap.view.tag];
    browser.browserStyle = XLPhotoBrowserStyleIndexLabel; // 微博样式
    
    // 设置长按手势弹出的地步ActionSheet数据,不实现此方法则没有长按手势
    [browser setActionSheetWithTitle:@"这是一个类似微信/微博的图片浏览器组件" delegate:self cancelButtonTitle:nil deleteButtonTitle:@"删除" otherButtonTitles:@"发送给朋友",@"保存图片",@"收藏",@"投诉",nil];
}

#pragma mark    -   XLPhotoBrowserDelegate

- (void)photoBrowser:(XLPhotoBrowser *)browser clickActionSheetIndex:(NSInteger)actionSheetindex currentImageIndex:(NSInteger)currentImageIndex
{
    // do something yourself
    switch (actionSheetindex) {
        case 4: // 删除
        {
            NSLog(@"点击了actionSheet索引是:%zd , 当前展示的图片索引是:%zd",actionSheetindex,currentImageIndex);
            [self.images removeObjectAtIndex:currentImageIndex];
            [self resetScrollView];
        }
            break;
        case 1: // 保存
        {
            NSLog(@"点击了actionSheet索引是:%zd , 当前展示的图片索引是:%zd",actionSheetindex,currentImageIndex);
            [browser saveCurrentShowImage];
        }
            break;
        default:
        {
            NSLog(@"点击了actionSheet索引是:%zd , 当前展示的图片索引是:%zd",actionSheetindex,currentImageIndex);
        }
            break;
    }
}

  • 如何选择浏览器样式
  • 获取到实例对象以后,设置browserStyle属性即可
    XLPhotoBrowser *browser = [XLPhotoBrowser showPhotoBrowserWithImages:self.images currentImageIndex:tap.view.tag];
    browser.browserStyle = XLPhotoBrowserStyleIndexLabel; // 微博样式

  • 如何修改pagecontrol为缩放动画样式
  • 仅在XLPhotoBrowserStylePageControl样式中有效, 在XLPhotoBrowserStyleIndexLabel样式无效
    // 自定义pageControl的一些属性
    browser.pageDotColor = [UIColor purpleColor]; ///< 此属性针对动画样式的pagecontrol无效
    browser.currentPageDotColor = [UIColor greenColor];
    browser.pageControlStyle = XLPhotoBrowserPageControlStyleClassic;///< 修改底部pagecontrol的样式为系统样式,默认是弹性动画的样式

  • 如何实现类似微信那样点击图片进入浏览器时的图片放大和退出浏览时图片缩放的过渡动画
  • 实现数据源方法中的photoBrowser:sourceImageViewForIndex:方法,传递图片的容器视图,才可以做过渡动画
#pragma mark    -   XLPhotoBrowserDatasource

- (UIImage *)photoBrowser:(XLPhotoBrowser *)browser placeholderImageForIndex:(NSInteger)index
{
    return self.images[index];
}

- (UIView *)photoBrowser:(XLPhotoBrowser *)browser sourceImageViewForIndex:(NSInteger)index
{
    return self.scrollView.subviews[index];
}

  • 如何使用XLPhotoBrowserConfig,
  • 如何开启调试模式,输出格式化的提示信息
  • 打开在XLPhotoBrowserConfig中的这个代码即可 //#define XLPhotoBrowserDebug 1
  • 还可以在这里修改很多样式属性,如:修改浏览器的背景色/图片间隔等 ,使用方式很简单,具体的使用就不在这里赘述

4. 更新日志

*   1.2.0
    *   1. 支持横竖屏适配(设备没有锁定方向,且项目配置支持横屏才可以触发横屏浏览模式)
    *   2. 更新SDWebImage到4.0.0 , 由于SDWebImage4.0版本对API进行了修改,所以不兼容SDWebImage4.0以下版本
    *   3. 修复图片下载进度条等已知bug
*   1.1.0 
    *   1. 优化框架结构,XLPhotoBrowser内部维护一个优先级为maxfloat的UIWindow,避免不同的项目会因为窗口问题造成XLPhotoBrowser显示不正确等问题
    *   2. 修改FSActionSheet源码,修复长按弹出ActionSheet显示在图片后面等问题
    *   3. 优化图片放大缩小处理逻辑,修复已知bug

5. 喜欢的话,就给作者一个star ,你可以通过下面的方式联系到我

  • QQ群 : 579572313 (有什么问题,欢迎进群讨论提问)
  • 邮箱 : coder_xl@163.com

6. 常见问题,可以参考这篇帖子XLPhotoBrowser常见问题汇总

相关文章

网友评论

  • __阳阳:希望能够加一个下拉退出的功能, 类似于微信那样的
  • PandaXiong:X上点击图片不能返回,没适配X啊
    不冗:一年前更新的 必然没适配啊
  • zysmoon:我是回来点赞的
  • 金___k:dismiss闪的那下是硬伤
  • Uncle_Gao:大佬你好 我的APP是横屏的,预览的图片为什么都是放大的效果啊 这个要怎么处理
  • 不辣先生:浏览的时候可以显示原图大小么?而不是屏宽等比例拉伸高?
  • 不辣先生:能否支持浏览模式frame 自定义?
  • 有偶像包袱的程序狗:希望后续更多的自定义功能, 比如悬浮按钮
  • 有偶像包袱的程序狗:请问 我保存图片的时候需要一个提示轮子 我用的SVP 但是在下层被遮挡了 。求解
    有偶像包袱的程序狗:算了 用你的方法吧~!~
  • Cofey_c:你们都没有遇到偶尔的卡死现象吗?只能杀掉应用
  • 一颗糖栗子:最新的版本有适配iPhoneX 吗? 如果没有的话 我觉得是时候适配了
  • eea4fe426602:我看了下载IOS11的系统的时候就不会显示,但是输出是有的
  • eea4fe426602:你有在IOS11上面运行吗?我在IOS11打开系统相册之后,取消相册,在点击图片就不会显示了,但是输出的内容是有的!
  • Monster_Lai:网络加载的图片 为什么每次点击都要闪一下灰色背景。不是加载过一次就可以直接加载了吗?
    shannoon:可以参阅我的demo,是否有这个情况!仔细追踪一下问题
  • 漫步时光1991:您好,我流浪图片的时候,然后长按弹出菜单栏,点击了删除按钮,没有效果呢。
  • 1b20e394625f:引用的第三方库和其他同样引用这些第三方库的会冲突
    1b20e394625f:比如 SDCycleScrollView
  • Helong:退出浏览的时候总是会有停顿的感觉,有点生硬啊,有没有解决方案!:relieved:
  • 896e933d536b:博主,你的过度动画实现了没?
  • 请叫我大帅666:怎么导入最后调用的时候都报链接错误, 视情况删除, 怎么个视情况删除法, 打开文件, 居然拖了里那个 SDWebImage 文件夹, 我也真的是无从下手, pod 导入直接就给我连SDWebImage 也导入了, 现在是一团麻
  • 0a4069affb24:不留github 地址的作者
  • 5fff1c1a968e:在点击之后,调用dismiss消失的时候,你们不会感觉是闪一下吗,由于是Pod导入的没法修改。楼主有做优化吗
    红尘_客:Pod导入的也可以修改吧,只是不建议修改
  • Matsonga:xcode9 保存图片 直接就崩了
  • e98dfc457ce7:你好,什么时候可以把视频的也加上就太完美了
  • e98dfc457ce7:你好,加载图片的时候有个灰色的背景,请问在哪里设置的
  • 不知蜕变的挣扎:屏幕旋转错误 转不过来 系统配置只支持竖屏,但是在控制器里 shouldAutorotate reture YES
  • 邹_1a07:error: linker command failed with exit code 1 拖入库后报次错误的原因之一(本人遇到的):由于项目中已经调用SDCycleScrollView ,而PageControl中的文件和SDCycleScrollView中重复调用。。。。。。浪费了小半天啊
    贫克慢:我的项目也是因为有SDWebImage4.0和SDCycleScrollView,所以pod进来有冲突,敢问兄台怎么处理的?
    896e933d536b:我的项目也是这样,兄台怎么处理的?
  • 徐小宾:uiview的扩展废弃的赶紧删掉就好了,总是会跟项目中原有的扩展冲突!
  • 我爱吃大糖饼:运行报错。library not found for -lSDWebImage
  • Matsonga:能否加一个查看原图才显示高清大图的功能
  • Zclee:为什么9系统单击退出浏览,取消不了
  • Zclee:加载网络图片的时候,怎么可以实现过度动画
  • Wen_Wei_Yen:你好,为什么swift调不出setActionSheetWithTitle这个方法。这个是对象方法 /Users/yanwenwei/Desktop/Snip20170623_22.png
  • 四海八荒_a78e:横屏貌似不适配
  • 四海八荒_a78e:一行代码搞定图片浏览的偶尔出不来图片 只有一个灰色背景上边有个白点
  • 四海八荒_a78e:pod不出来
  • 々七夜圣君:pod导入运行直接报错误老铁哥 error: linker command failed with exit code 1
  • 木木123456:我把SDWebImage改成3.8.0或者3.9.0版本后,工程老是报错,怎么办,用不了啊
    勿忘初衷_2519:@shannoon 我的是SDWebImage4.0的pod添加,你的这个是用工程添加的,运行报错 reference to "SDWebImageRetryFailed" is ambiguous ,求解
    shannoon:SDWebImage4.0版本对SDWebImageDownloaderProgressBlock类型做了修改 , typedef void(^SDWebImageDownloaderProgressBlock)(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL);多了一个targetURL,你看一下报错日志,自己适配一下,应该很快解决的
    Damon___:遇到了同样的状况
  • 笙绳省盛:用了下确实是一段代码就完成了大图浏览,好用,点赞👍
  • MrZombie:偶尔会发生图片视图退不出去,
    MrZombie:@shannoon 直接添加到这个就不会了:UIWindow *window = [[UIApplication sharedApplication]keyWindow];
    MrZombie:@shannoon 好像是Window的问题,添加到这个方法查找到的window就会,可能是多个window冲突了
    #pragma mark - private method

    - (UIWindow *)findTheMainWindow
    {
    NSEnumerator *frontToBackWindows = [UIApplication.sharedApplication.windows reverseObjectEnumerator];
    for (UIWindow *window in frontToBackWindows) {
    BOOL windowOnMainScreen = window.screen == UIScreen.mainScreen;
    BOOL windowIsVisible = !window.hidden && window.alpha > 0;
    BOOL windowLevelSupported = (window.windowLevel >= UIWindowLevelNormal);
    BOOL windowSizeIsEqualToScreen = (window.xl_width == XLScreenW && window.xl_height == XLScreenH);
    if(windowOnMainScreen && windowIsVisible && windowLevelSupported && windowSizeIsEqualToScreen) {
    return window;
    }
    }

    XLPBLog(@"XLPhotoBrowser在当前工程未匹配到合适的window,请根据工程架构酌情调整此方法,匹配最优窗口");
    if (XLPhotoBrowserDebug) {
    NSAssert(false, @"XLPhotoBrowser在当前工程未匹配到window,请根据工程架构酌情调整findTheMainWindow方法,匹配最优窗口");
    }

    UIWindow * delegateWindow = [[[UIApplication sharedApplication] delegate] window];
    return delegateWindow;
    }

    然后我直接添加到这个就不会了:UIWindow *window = [[UIApplication sharedApplication]keyWindow];
    shannoon:可以描述的更详细一点嘛?下次再出现这种情况,可以看一下退出的方法有没有被调用,尝试解决一下,然后反馈给我,谢谢!:smile:
  • 風华绝世:666,学习了 , 再次感谢大佬的代码
  • championfu:有木有图片选择框架(多选)
    shannoon:你可以看一下我的另一个框架,XLPhoto,没有写readme,你需要自己下载看一下效果
  • d7fe8c1f53fe:为什么加载网络图片 进度条不重新绘制 drawrect 不调用了 并且加载成功之后 进度条不消失
    shannoon:原因是新版SDWebImage对progress的block回调线程做了修改,1.2.0的XLPhotoBrowser已适配新版SDWebImage
  • af3fcf3cee36:不错,显示效果很好,注释特别清晰,多谢。
    请叫我大帅666:不知道我的图片加载出来不清晰, 在哪修改压缩值?
  • 打瞌睡de小男孩:楼主,我没用的demo里面的sdwebimage,自己项目里面cocoapods集成的,估计版本不一样,报错了,请问你用的是什么版本的?
    shannoon:@打瞌睡de小男孩 你把我的删掉就好,有什么不一样的,对接一下新的sdk接口,不是什么大问题
  • 0df306bd4aa6: [XLPhotoBrowser showPhotoBrowserWithImages:self.picArr currentImageIndex:self.index];
    我调用了这个浏览图片,浏览之后退不出去,好像是没有源视图什么的,这个怎么设置啊,单击之后不能退出,直接黑屏。用其他的方法也退不出去
    shannoon:@0df306bd4aa6 你可以看看我的demo, 单击图片就可以退出浏览的,你这里不行嘛?
  • ethan_cun:传入url的数组 图片加载不出来;传入uiimage的数组 可以显示 怎么解决
    shannoon:@EthanCun url是支持的,看demo中示例5加载网络图片:smile:
  • kdlai:你这图都是用着人家MWPhotoBrowser的:joy:
    shannoon:太长时间了,我不确定用了他的图!!!不过我在写这个框架的时候,确实学习了MW的框架,MW框架很厉害只是不能满足我的交互需要:smile:
  • 主动打电话:你骗我,一行代码调用不了
    shannoon:你去看我demo,你可能用了假的XLPhotoBrowser:smile:
  • 木头炫:浏览图片的时候长按图片,出现actionSheet对话框,怎么在图片图层下,被遮盖了。
    丶过客匆匆:@shannoon +1我也遇到了。。不知道楼主是否已经解决了这个问题。
    木头炫:@shannoon 偶发的,我已经给你邮箱发了个邮件。我马上加下群
    shannoon:这么厉害,可以复现嘛?还是偶发,方便的话,你加qq群,详聊一下
  • LambZhou:你好!XLPhotoBrowser里有SDWebImage,可是我的Demo已经pods了SDWebImage,我不想删,怎么办?我该拉哪些文件进我的Demo里呢?
    请叫我大帅666:@shannoon 我的怎么删, 最后都会报链接错误,几近疯狂啊
    LambZhou:谢谢~已经搞掂了~
    shannoon:把XLPhotoBrowser中的SDWebImage删掉即可
  • Kingiiyy_iOS:找了挺多图片浏览器的..感觉这个给力哈...谢谢分享...不知道是我自己操作问题还是咋的加载网络图片的时候从缩略图到大图动画的过程是没有图片的
    2ee1d37028c9:是啊,这个问题我也遇到了,这是个严重的问题
  • Sanchain:不错,挺好用的,谢谢分享。
  • 陆宝宝:给你点个赞

本文标题:iOS图片浏览器 - XLPhotoBrowser(类似微信多图

本文链接:https://www.haomeiwen.com/subject/tszbjttx.html