1、背景
xcasset是苹果为iOS开发者提供的高效文件图片寻址,slicing,图片分包的图片文件管理工具。
xcasset中图片结构如图,每张图片根据机型不同,像素大小也不同。2x,3x图片在imageset文件夹下,同时还有一个contents.json文件标识1x,2x,3x图片分别是哪张。
2、使用习惯不好带来困扰
有时开发时为了方便,直接不改图片名称直接将图片拖拽到imageset中,为了代码可读性,工程开发往往约定好图片的命名规则,所以imageset的命名要比真实图片名(实体文件名)规则,app运行的时候加载图片是根据imageset的名称加载的(索引名),所以真实图片名怎么起都不会有影响。下图是索引名和实体文件名不一样的情况
differentName.png
下图是content.json的内容
share.png
3、解决方法
这么做可能会对之后的无用图片排查,为了减少包大小进行图片压缩造成一定的困扰,所以索引名和实体文件名尽量一致。
为了解决不一致现象,可以手动修改实体文件名,但图片太多又显得枯燥,改后的一段时间再经若干迭代还会有这种现象出现。可以用脚本解决这个问题,快速,方便,还可以和小伙伴吹牛。
4、原理
脚本需要做三件事
1)遍历工程中所有 .imageset文件,找到索引名和实体文件名不一样的图片。
2)将1x,2x,3x图片名称改为和 .imageset的文件名称一致。
3)将contents.json文件中的图片名称也替换为 .imageset的文件名。
5、使用方式
sh /Users/liyi/Desktop/sh/file_name.sh /Users/liyi/Desktop/sh/TestDir
如下图
sh的意思是执行shell脚本, /Users/liyi/Desktop/sh/file_name.sh 是脚本所在路径,/Users/liyi/Desktop/sh/TestDir是所要操作的iOS工程的文件夹,这样就可以将工程下所有索引名和实体文件名的图片名都替换为索引名。
use.png
6、代码
#!/bin/bash
#echo -e "please drag a file or input dile name \n"
#read dirPath
#d_suffix :文件夹后缀
#sub_path :文件夹后缀
#dir_or_file :文件除了文件名称的路径
#real_name :imageset之前的名称(没有后缀)
#finial_old_name :修改前的图片名(带后缀)
#finial_real_name :修改后的图片名(带后缀)
#找到png的后缀
suffix="png"
image_2x_suffix="@2x.png"
image_3x_suffix="@3x.png"
image_1x_suffix="@.png"
content_suffix=".json"
picture_d_suffix="imageset"
#content.json文件中字符串替换
function changeContentFile() {
origin_name="$1"
new_name="$2"
contentPath="$3"
if test "$new_name" != "_"
then
sed -i "" "s/$origin_name/$new_name/g" "$content_path"
fi
}
#寻找需要替换的文件
function findFile() {
for file in `ls $1`
do
dir_or_file=$1"/"$file
if test -d $dir_or_file
then
d_suffix=${file:0-8:8}
#如果后缀是imageset
if test "$d_suffix" = "$picture_d_suffix"
then
sub_path=$dir_or_file"/"
real_name=${dir_or_file##*/}
real_name=${real_name%.*}
before_1x_name="_"
before_2x_name="-"
before_3x_name="-"
finial_1x_real_name="_"
finial_2x_real_name="_"
finial_3x_real_name="_"
#算出改名后的名字
for subfile in `ls $sub_path`
do
finial_old_name=${subfile##*/}
finial_new_name="-"
#2x图片
if test "${finial_old_name:0-7:7}" = "$image_2x_suffix"
then
before_2x_name=$subfile
finial_new_name=$sub_path$real_name$image_2x_suffix
if test "$sub_path$subfile" != "$finial_new_name"
then
finial_2x_real_name=$real_name$image_2x_suffix
mv $sub_path$subfile $finial_new_name
fi
fi
#3x图片
if test "${finial_old_name:0-7:7}" = "$image_3x_suffix"
then
before_3x_name=$subfile
finial_new_name=$sub_path$real_name$image_3x_suffix
if test "$sub_path$subfile" != "$finial_new_name"
then
finial_3x_real_name=$real_name$image_3x_suffix
mv $sub_path$subfile $finial_new_name
fi
fi
#1x图片
if test "${finial_old_name:0-4:4}" = "$image_1x_suffix"
then
before_1x_name=subfile
finial_new_name=$sub_path$real_name$image_1x_suffix
if test "$sub_path$subfile" != "$finial_new_name"
then
finial_1x_real_name=$real_name$image_1x_suffix
mv $sub_path$subfile $finial_new_name
fi
fi
done
#content.json文件
content_path=$sub_path"Contents.json"
changeContentFile $before_1x_name $finial_1x_real_name $content_path
changeContentFile $before_2x_name $finial_2x_real_name $content_path
changeContentFile $before_3x_name $finial_3x_real_name $content_path
else
findFile $dir_or_file
fi
fi
done
}
root_dir="$1"
findFile $root_dir
7、修改后
执行过后产生的diff如下图
脚本执行后的diff.png
上边代码换行看着很不舒服,截图一张
代码截图.png看到最后辛苦了,希望对你有帮助
多谢观看☺
网友评论