1、背景
xcasset是蘋果為iOS開發(fā)者提供的高效文件圖片尋址,slicing,圖片分包的圖片文件管理工具。
xcasset中圖片結(jié)構(gòu)如圖,每張圖片根據(jù)機(jī)型不同,像素大小也不同。2x,3x圖片在imageset文件夾下,同時(shí)還有一個(gè)contents.json文件標(biāo)識(shí)1x,2x,3x圖片分別是哪張。

2、使用習(xí)慣不好帶來困擾
有時(shí)開發(fā)時(shí)為了方便,直接不改圖片名稱直接將圖片拖拽到imageset中,為了代碼可讀性,工程開發(fā)往往約定好圖片的命名規(guī)則,所以imageset的命名要比真實(shí)圖片名(實(shí)體文件名)規(guī)則,app運(yùn)行的時(shí)候加載圖片是根據(jù)imageset的名稱加載的(索引名),所以真實(shí)圖片名怎么起都不會(huì)有影響。下圖是索引名和實(shí)體文件名不一樣的情況

下圖是content.json的內(nèi)容

3、解決方法
這么做可能會(huì)對(duì)之后的無用圖片排查,為了減少包大小進(jìn)行圖片壓縮造成一定的困擾,所以索引名和實(shí)體文件名盡量一致。
為了解決不一致現(xiàn)象,可以手動(dòng)修改實(shí)體文件名,但圖片太多又顯得枯燥,改后的一段時(shí)間再經(jīng)若干迭代還會(huì)有這種現(xiàn)象出現(xiàn)??梢杂媚_本解決這個(gè)問題,快速,方便,還可以和小伙伴吹牛。
4、原理
腳本需要做三件事
1)遍歷工程中所有 .imageset文件,找到索引名和實(shí)體文件名不一樣的圖片。
2)將1x,2x,3x圖片名稱改為和 .imageset的文件名稱一致。
3)將contents.json文件中的圖片名稱也替換為 .imageset的文件名。
5、使用方式
sh /Users/liyi/Desktop/sh/file_name.sh /Users/liyi/Desktop/sh/TestDir
如下圖
sh的意思是執(zhí)行shell腳本, /Users/liyi/Desktop/sh/file_name.sh 是腳本所在路徑,/Users/liyi/Desktop/sh/TestDir是所要操作的iOS工程的文件夾,這樣就可以將工程下所有索引名和實(shí)體文件名的圖片名都替換為索引名。

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、修改后
執(zhí)行過后產(chǎn)生的diff如下圖

上邊代碼換行看著很不舒服,截圖一張

看到最后辛苦了,希望對(duì)你有幫助
多謝觀看?