由于项目是海外应用,需要适配阿拉伯语,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.
- 给TZImagePickerConfig 增加一个属性 customPreviewCollectionViewLayout
1
为什么要加在这个类里面? 因为设置语言包等方法都在这里,在这里就可以根据不同语言需要包自定义布局传递进去
NSString *countryStr = UIView.isRTL ? @"ar" : @"en"; [TZImagePickerConfig sharedInstance].languageBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:countryStr ofType:@"lproj"]];
......
.....
[TZImagePickerConfig sharedInstance].customPreviewCollectionViewLayout = customLayout;
-
给TZPhotoPreviewController 增加属性
-
修改TZPhotoPreviewController 的layout初始化方法
image.png
3.找到TZPhotoPreviewController实例化地方,把自定义布局赋值
网友评论