1趟畏、背景
xcasset是蘋果為iOS開發(fā)者提供的高效文件圖片尋址贡歧,slicing,圖片分包的圖片文件管理工具赋秀。
xcasset中圖片結構如圖利朵,每張圖片根據(jù)機型不同,像素大小也不同沃琅。2x,3x圖片在imageset文件夾下哗咆,同時還有一個contents.json文件標識1x蜘欲,2x益眉,3x圖片分別是哪張。
2、使用習慣不好帶來困擾
有時開發(fā)時為了方便郭脂,直接不改圖片名稱直接將圖片拖拽到imageset中年碘,為了代碼可讀性,工程開發(fā)往往約定好圖片的命名規(guī)則展鸡,所以imageset的命名要比真實圖片名(實體文件名)規(guī)則屿衅,app運行的時候加載圖片是根據(jù)imageset的名稱加載的(索引名),所以真實圖片名怎么起都不會有影響莹弊。下圖是索引名和實體文件名不一樣的情況
下圖是content.json的內(nèi)容
3涤久、解決方法
這么做可能會對之后的無用圖片排查,為了減少包大小進行圖片壓縮造成一定的困擾忍弛,所以索引名和實體文件名盡量一致响迂。
為了解決不一致現(xiàn)象,可以手動修改實體文件名细疚,但圖片太多又顯得枯燥蔗彤,改后的一段時間再經(jīng)若干迭代還會有這種現(xiàn)象出現(xiàn)》杓妫可以用腳本解決這個問題然遏,快速,方便吧彪,還可以和小伙伴吹牛待侵。
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的意思是執(zhí)行shell腳本, /Users/liyi/Desktop/sh/file_name.sh 是腳本所在路徑扑毡,/Users/liyi/Desktop/sh/TestDir是所要操作的iOS工程的文件夾胃榕,這樣就可以將工程下所有索引名和實體文件名的圖片名都替換為索引名。
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如下圖
上邊代碼換行看著很不舒服,截圖一張
看到最后辛苦了换帜,希望對你有幫助
多謝觀看?