TZImagePickerController在阿拉伯语状态下bug修复

由于项目是海外应用,需要适配阿拉伯语,app内部支持语言切换,当切换阿拉伯语后,app的所有页面布局需要做镜像翻转: 从左往右布局需要改成从右往左布局.

项目集成了TZImagePickerController 开源框架, 但是在切换成阿拉伯语情况下,TZImagePickerController 的图片预览功能有问题:
在框架的图片列表页面,点击第一张图片,弹出的预览页面却显示最后一张;点击第二张图片,预览页面却显示倒数第二张,依次类推;

上了github issues 查了下,发现早在18年是后就有人反馈了这个问题,跟我现在的情况一模一样



我项目里面使用的是目前最新版 3.6.4 ,依然遇到了这种问题.

当然不一定是框架本身的bug,也有可能是项目里面切换阿拉伯语过程中,一些runtime 方法影响到了框架 ?

所以只能修改框架源码来解决问题了.

经过排查,把问题定位到了TZPhotoPreviewController 这个类,
这个类的设置 collectionView 的偏移量在阿拉伯语下不对


由于在阿拉伯语状态下,图片预览滚动方向由 从左到右变成了从右到左,
根据之前项目经验,我推测可能是collectionView的布局问题;

我自定义的布局是,定义一个类继承自UICollectionViewFlowLayout重写如下两个方法

@implementation QYRTLCollectionViewFlowLayout

- (UIUserInterfaceLayoutDirection)effectiveUserInterfaceLayoutDirection {

    if ([UIView isRTL]) {
        return UIUserInterfaceLayoutDirectionRightToLeft;
    }
    return UIUserInterfaceLayoutDirectionLeftToRight;
}

- (BOOL)flipsHorizontallyInOppositeLayoutDirection {
    return [UIView isRTL];
}
@end

替换之后问题等到解决;

接下来,思考的是,如何在改动框架源码最小的情况下,修复那个bug.

  1. 给TZImagePickerConfig 增加一个属性 customPreviewCollectionViewLayout
1

为什么要加在这个类里面? 因为设置语言包等方法都在这里,在这里就可以根据不同语言需要包自定义布局传递进去

NSString *countryStr = UIView.isRTL ? @"ar" : @"en";  [TZImagePickerConfig sharedInstance].languageBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:countryStr ofType:@"lproj"]];
......
.....
 [TZImagePickerConfig sharedInstance].customPreviewCollectionViewLayout = customLayout;
  1. 给TZPhotoPreviewController 增加属性


  2. 修改TZPhotoPreviewController 的layout初始化方法


    image.png

3.找到TZPhotoPreviewController实例化地方,把自定义布局赋值






推荐阅读更多精彩内容