[{"data":1,"prerenderedAt":1466},["ShallowReactive",2],{"navigation_docs":3,"-ios-set-launch-screen":173,"-ios-set-launch-screen-surround":1461},[4,22,29,36,107,138,145,161],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"博客","i-lucide-pen-line","\u002Fblog","0.blog",[10,12,17],{"title":5,"path":7,"stem":11,"icon":6},"0.blog\u002Findex",{"title":13,"path":14,"stem":15,"icon":16},"创建基于 UIKit 的原生 iOS 项目","\u002Fblog\u002Fcreate-uikit-ios-project","0.blog\u002F01.create-uikit-ios-project","i-lucide-app-window",{"title":18,"path":19,"stem":20,"icon":21},"Lockify：把账号和密码留在自己的手机里","\u002Fblog\u002Flockify","0.blog\u002F02.lockify","i-lucide-lock",{"title":23,"path":24,"stem":25,"children":26,"icon":28},"年度总结","\u002Fannual-review","1.annual-review\u002Findex",[27],{"title":23,"path":24,"stem":25,"icon":28},"i-lucide-git-commit",{"title":30,"path":31,"stem":32,"children":33,"icon":35},"故事","\u002Fstories","2.stories\u002Findex",[34],{"title":30,"path":31,"stem":32,"icon":35},"i-lucide-feather",{"title":37,"icon":38,"path":39,"stem":40,"children":41},"Android","i-simple-icons-android","\u002Fandroid","3.android",[42,44,49],{"title":37,"path":39,"stem":43,"icon":38},"3.android\u002Findex",{"title":45,"path":46,"stem":47,"icon":48},"初探Navigation","\u002Fandroid\u002Fcompose-navigation","3.android\u002F01.compose-navigation","i-lucide-route",{"title":50,"icon":51,"path":52,"stem":53,"children":54},"安卓代码加固","i-lucide-shield","\u002Fandroid\u002Fhidden-hardening","3.android\u002F02.hidden-hardening\u002Findex",[55,58,62,67,72,77,82,87,92,97,102],{"title":56,"path":52,"stem":53,"icon":57},"安卓代码加固：总览","i-lucide-map",{"title":59,"path":60,"stem":61,"icon":21},"安卓代码加固（1）：加密DEX","\u002Fandroid\u002Fhidden-hardening\u002Fencrypt-dex","3.android\u002F02.hidden-hardening\u002F01.encrypt-dex",{"title":63,"path":64,"stem":65,"icon":66},"安卓代码加固（2）：Native解密","\u002Fandroid\u002Fhidden-hardening\u002Fnative-decrypt","3.android\u002F02.hidden-hardening\u002F02.native-decrypt","i-lucide-cpu",{"title":68,"path":69,"stem":70,"icon":71},"安卓代码加固（3）：内存加载","\u002Fandroid\u002Fhidden-hardening\u002Fmemory-load","3.android\u002F02.hidden-hardening\u002F03.memory-load","i-lucide-memory-stick",{"title":73,"path":74,"stem":75,"icon":76},"安卓代码加固（4）：指令分发","\u002Fandroid\u002Fhidden-hardening\u002Fopcode-dispatch","3.android\u002F02.hidden-hardening\u002F04.opcode-dispatch","i-lucide-hash",{"title":78,"path":79,"stem":80,"icon":81},"安卓代码加固（5）：XOR混淆","\u002Fandroid\u002Fhidden-hardening\u002Fxor-obfuscate","3.android\u002F02.hidden-hardening\u002F05.xor-obfuscate","i-lucide-shuffle",{"title":83,"path":84,"stem":85,"icon":86},"安卓代码加固（6）：密钥外置","\u002Fandroid\u002Fhidden-hardening\u002Fkey-external","3.android\u002F02.hidden-hardening\u002F06.key-external","i-lucide-key",{"title":88,"path":89,"stem":90,"icon":91},"安卓代码加固（7）：依赖隔离","\u002Fandroid\u002Fhidden-hardening\u002Fdep-isolate","3.android\u002F02.hidden-hardening\u002F07.dep-isolate","i-lucide-layers",{"title":93,"path":94,"stem":95,"icon":96},"安卓代码加固（8）：构建校验","\u002Fandroid\u002Fhidden-hardening\u002Fbuild-verify","3.android\u002F02.hidden-hardening\u002F08.build-verify","i-lucide-shield-check",{"title":98,"path":99,"stem":100,"icon":101},"安卓代码加固（9）：防录屏","\u002Fandroid\u002Fhidden-hardening\u002Fflag-secure","3.android\u002F02.hidden-hardening\u002F09.flag-secure","i-lucide-eye-off",{"title":103,"path":104,"stem":105,"icon":106},"安卓代码加固（10）：ABI门禁","\u002Fandroid\u002Fhidden-hardening\u002Fabi-gate","3.android\u002F02.hidden-hardening\u002F10.abi-gate","i-lucide-git-compare",{"title":108,"icon":109,"path":110,"stem":111,"children":112},"iOS","i-simple-icons-apple","\u002Fios","4.ios",[113,115,120,125,129,133],{"title":108,"path":110,"stem":114,"icon":109},"4.ios\u002Findex",{"title":116,"path":117,"stem":118,"icon":119},"iOS面试题1","\u002Fios\u002Fios-interview1","4.ios\u002F01.ios-interview1","i-lucide-sparkles",{"title":121,"path":122,"stem":123,"icon":124},"设置启动图","\u002Fios\u002Fset-launch-screen","4.ios\u002F02.set-launch-screen","i-lucide-image",{"title":126,"path":127,"stem":128,"icon":48},"路由管理","\u002Fios\u002Frouting","4.ios\u002F03.routing",{"title":130,"path":131,"stem":132,"icon":91},"状态管理","\u002Fios\u002Fstate-management","4.ios\u002F04.state-management",{"title":134,"path":135,"stem":136,"icon":137},"事件传递","\u002Fios\u002Fevent-delivery","4.ios\u002F05.event-delivery","i-lucide-pointer",{"title":139,"path":140,"stem":141,"children":142,"icon":144},"Flutter","\u002Fflutter","5.flutter\u002Findex",[143],{"title":139,"path":140,"stem":141,"icon":144},"i-simple-icons-flutter",{"title":146,"icon":147,"path":148,"stem":149,"children":150,"page":160},"面试","i-lucide-graduation-cap","\u002Finterview","6.interview",[151,156],{"title":152,"path":153,"stem":154,"icon":155},"Flutter面试题1","\u002Finterview\u002Fflutter-interview1","6.interview\u002F01.flutter-interview1","i-lucide-boxes",{"title":157,"path":158,"stem":159,"icon":66},"Flutter面试题2","\u002Finterview\u002Fflutter-interview2","6.interview\u002F02.flutter-interview2",false,{"title":162,"icon":163,"path":164,"stem":165,"children":166},"算法学习","i-lucide-binary","\u002Falgorithm","7.algorithm",[167,169],{"title":162,"path":164,"stem":168,"icon":163},"7.algorithm\u002Findex",{"title":170,"path":171,"stem":172},"算法基础1：复杂度分析","\u002Falgorithm\u002Ftime-space-complexity","7.algorithm\u002F01.time-space-complexity",{"id":174,"title":121,"body":175,"description":1435,"extension":1436,"links":1437,"meta":1448,"navigation":1456,"path":122,"seo":1457,"stem":123,"__hash__":1460},"docs\u002F4.ios\u002F02.set-launch-screen.md",{"type":176,"value":177,"toc":1420},"minimark",[178,187,190,194,197,242,245,250,254,261,297,311,317,358,368,414,421,424,427,436,439,446,450,459,475,482,488,522,685,692,695,698,708,787,801,804,810,815,820,823,942,1078,1081,1091,1095,1098,1117,1154,1160,1163,1168,1174,1237,1330,1339,1342,1345,1348,1372,1382,1388,1391,1394,1405,1416],[179,180,181,182,186],"p",{},"虽然这件事 AI一句话就可以搞定，但是我们还是自己捣鼓一下。环境还是 ",[183,184,185],"strong",{},"Xcode >= 16.5","。",[179,188,189],{},"启动图上不能跑代码，也不能做动画。首帧画出来之后，系统就把它撤掉。",[191,192,193],"h2",{"id":193},"先选一种做法",[179,195,196],{},"iOS 14 之后有两种方法可以设置启动图。",[198,199,200,213],"table",{},[201,202,203],"thead",{},[204,205,206,210],"tr",{},[207,208,209],"th",{},"做法",[207,211,212],{},"介绍",[214,215,216,228],"tbody",{},[204,217,218,225],{},[219,220,221],"td",{},[222,223,224],"code",{},"UILaunchScreen",[219,226,227],{},"iOS 14 起写在 Info 里，底色加一张图",[204,229,230,235],{},[219,231,232],{},[222,233,234],{},"LaunchScreen.storyboard",[219,236,237,238,241],{},"苹果推荐：LaunchScreen.storyboard（",[183,239,240],{},"一套图适配所有 iPhone\u002FiPad，自动布局","）",[191,243,244],{"id":244},"storyboard",[179,246,247,248,186],{},"在创建传统Storyboar项目时，项目中默认会有",[222,249,234],{},[251,252,253],"h3",{"id":253},"配置启动图",[179,255,256,257,260],{},"在Storyboar项目中，在",[222,258,259],{},"project.pbxproj","文件中默认带了下面配置：",[262,263,268],"pre",{"className":264,"code":265,"language":266,"meta":267,"style":267},"language-Swift shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;\nINFOPLIST_KEY_UIMainStoryboardFile = Main;\n","Swift","",[222,269,270,286],{"__ignoreMap":267},[271,272,275,279,283],"span",{"class":273,"line":274},"line",1,[271,276,278],{"class":277},"sTEyZ","INFOPLIST_KEY_UILaunchStoryboardName ",[271,280,282],{"class":281},"sMK4o","=",[271,284,285],{"class":277}," LaunchScreen;\n",[271,287,289,292,294],{"class":273,"line":288},2,[271,290,291],{"class":277},"INFOPLIST_KEY_UIMainStoryboardFile ",[271,293,282],{"class":281},[271,295,296],{"class":277}," Main;\n",[179,298,299,300,303,304,307,308,186],{},"工程默认开了 ",[222,301,302],{},"GENERATE_INFOPLIST_FILE = YES","，这个键会写进最终的 ",[222,305,306],{},"Info.plist","，对应系统读的 ",[222,309,310],{},"UILaunchStoryboardName",[179,312,313,314,316],{},"同时，你也可以手动配置，只需要在",[222,315,306],{},"里添加下面配置：",[318,319,321,326,332,335,345,348],"steps",{"level":320},"4",[322,323,325],"h4",{"id":324},"打开-general","打开 General",[179,327,328,329,186],{},"选中项目 Target，切到 ",[183,330,331],{},"General",[322,333,334],{"id":334},"找到启动图设置",[179,336,337,338,341,342,186],{},"在 ",[183,339,340],{},"App Icons and Launch Images"," 里定位 ",[183,343,344],{},"Launch Screen File",[322,346,347],{"id":347},"选择启动图文件",[179,349,350,351,353,354,357],{},"下拉选择 ",[222,352,234],{},"，注意文件名称默认是",[222,355,356],{},"LaunchScreen","，注意空格。",[359,360,361,362,364,365,186],"note",{},"Xcode 在 ",[222,363,306],{}," 写入 ",[222,366,367],{},"UILaunchStoryboardName = LaunchScreen",[262,369,373],{"className":370,"code":371,"language":372,"meta":267,"style":267},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Ckey>UILaunchStoryboardName\u003C\u002Fkey>\n\u003Cstring>LaunchScreen\u003C\u002Fstring>\n","xml",[222,374,375,397],{"__ignoreMap":267},[271,376,377,380,384,387,389,392,394],{"class":273,"line":274},[271,378,379],{"class":281},"\u003C",[271,381,383],{"class":382},"swJcz","key",[271,385,386],{"class":281},">",[271,388,310],{"class":277},[271,390,391],{"class":281},"\u003C\u002F",[271,393,383],{"class":382},[271,395,396],{"class":281},">\n",[271,398,399,401,404,406,408,410,412],{"class":273,"line":288},[271,400,379],{"class":281},[271,402,403],{"class":382},"string",[271,405,386],{"class":281},[271,407,356],{"class":277},[271,409,391],{"class":281},[271,411,403],{"class":382},[271,413,396],{"class":281},[179,415,416,417,420],{},"手动声明会覆盖",[222,418,419],{},"INFOPLIST_KEY_UILaunchStoryboardName",",打包时会把这份 plist 和其余自动生成的键合并，不用额外处理，但如果遇到如果不生效可以删除此配置。",[179,422,423],{},"图片说明：",[179,425,426],{},"第一步：",[179,428,429],{},[430,431],"img",{"alt":432,"className":433,"src":435},"2026-09-29 上午11.38.56.webp",[434],"max-w-md","https:\u002F\u002Ffilebed.chenyiren.top\u002Ffiles\u002F2026\u002F09\u002F7374d51bfea2041a2fa3.webp",[179,437,438],{},"第二步：",[179,440,441],{},[430,442],{"alt":443,"className":444,"src":445},"2026-09-29 上午11.40.00.webp",[434],"https:\u002F\u002Ffilebed.chenyiren.top\u002Ffiles\u002F2026\u002F09\u002F2fd15f908ff0d4d51f88.webp",[322,447,449],{"id":448},"默认情况下是可视化布局也可以在源码之间切换","默认情况下是可视化布局，也可以在源码之间切换",[179,451,452,454,455,458],{},[222,453,234],{}," 可以当画布拖，也可以当 XML 改。在左侧项目导航器里右键这个文件，选 ",[183,456,457],{},"Open As","：",[460,461,462,469],"ul",{},[463,464,465,468],"li",{},[183,466,467],{},"Interface Builder","：可视化画布，拖控件排版。双击文件时默认打开这个",[463,470,471,474],{},[183,472,473],{},"Source Code","：底层 XML。要整段复制 storyboard 时用这个",[251,476,478,479],{"id":477},"居中-logo","居中 ",[222,480,481],{},"Logo",[179,483,484,485,487],{},"我在用 ",[222,486,234],{}," 时，常用的就是纯色背景，正中放一张 Logo。宽高写死、位置居中，各尺寸屏幕上差别很小，不用按机型各做一张。",[179,489,490,491,494,495,498,499,502,503,506,507,510,511,514,515,518,519,186],{},"Logo 先放进 ",[222,492,493],{},"Assets.xcassets","。在资源目录上右键，选 ",[183,496,497],{},"New Image Set","，名字用 ",[222,500,501],{},"LaunchLogo","。把 ",[222,504,505],{},"@2x","、",[222,508,509],{},"@3x"," 拖进去。只有一张 PDF 时，选中这个 Image Set，右侧 ",[183,512,513],{},"Scales"," 改成 ",[183,516,517],{},"Single Scale","，并勾上 ",[183,520,521],{},"Preserve Vector Data",[318,523,524,527,537,548,555,559,573,579,599,602,609,621,635,646,668,674],{"level":320},[322,525,526],{"id":526},"铺纯色背景",[179,528,529,530,532,533,536],{},"打开 ",[222,531,234],{},"。左侧大纲里点场景下的 ",[183,534,535],{},"View","，点的是根视图，不是外层的 View Controller。",[179,538,539,540,543,544,547],{},"右侧 ",[183,541,542],{},"Attributes Inspector"," 里把 ",[183,545,546],{},"Background"," 改成纯色。这是根视图的底色，会铺满整屏。",[179,549,550,551,554],{},"要跟着浅色、深色模式变，就在 Assets 里再建一个 ",[183,552,553],{},"Color Set","，背景选这个颜色名。写死的 RGB 不会随系统切换。",[322,556,558],{"id":557},"放上-image-view","放上 Image View",[179,560,561,564,565,568,569,572],{},[183,562,563],{},"View → Show Library","（",[222,566,567],{},"Shift + Cmd + L","），搜 ",[183,570,571],{},"Image View","，拖到根 View 上。",[179,574,575,576,578],{},"选中它，在 ",[183,577,542],{}," 里设置：",[460,580,581,590],{},[463,582,583,586,587,589],{},[183,584,585],{},"Image"," 选 ",[222,588,501],{},"。填资源名，不带扩展名",[463,591,592,586,595,598],{},[183,593,594],{},"Content Mode",[183,596,597],{},"Aspect Fit","。Logo 按比例放进这块区域，不会被拉变形",[322,600,601],{"id":601},"约束到屏幕正中",[179,603,604,605,608],{},"选中 Image View，点画布右下角的 ",[183,606,607],{},"Align","。勾上：",[460,610,611,616],{},[463,612,613],{},[183,614,615],{},"Horizontally in Container",[463,617,618],{},[183,619,620],{},"Vertically in Container",[179,622,623,624,627,628,631,632,186],{},"点 ",[183,625,626],{},"Add 2 Constraints","。这是相对根 View 的 ",[222,629,630],{},"centerX"," 和 ",[222,633,634],{},"centerY",[179,636,637,638,641,642,645],{},"左侧大纲里展开这两条约束。第二项如果是 ",[183,639,640],{},"Safe Area","，改成 ",[183,643,644],{},"Superview","。Safe Area 会算上刘海和底部横条，Logo 会偏下一点。",[179,647,648,649,652,653,631,656,659,660,631,663,665,666,186],{},"再点旁边的 ",[183,650,651],{},"Add New Constraints","，勾上 ",[183,654,655],{},"Width",[183,657,658],{},"Height","，按设计尺寸填，比如 ",[222,661,662],{},"120",[222,664,662],{},"，然后 ",[183,667,626],{},[179,669,670,671,673],{},"四条都在就够了：水平居中、垂直居中、宽度、高度。只做居中、不写宽高时，Image View 会按图片像素撑开，",[222,672,509],{}," 资源经常把 Logo 撑得很大。",[179,675,676,677,680,681,684],{},"画布上约束发黄或发红时，选中 Image View，点 ",[183,678,679],{},"Resolve Auto Layout Issues","，选 ",[183,682,683],{},"Update Frames","，让预览跟约束对齐。",[359,686,687,688,691],{},"启动图里只能放系统控件，",[222,689,690],{},"UIImageView"," 可以，自定义类不行。这里也连不上 outlet，颜色和约束保存在 storyboard 里即可。",[251,693,694],{"id":694},"单图铺满",[179,696,697],{},"启动图本身就是一整张画面时，用一张图贴满屏幕。Logo 和文案都画在这张图里，storyboard 上不再单独放控件。",[179,699,700,701,703,704,707],{},"图同样放进 ",[222,702,493],{},"，Image Set 起名 ",[222,705,706],{},"LaunchBackground","。按要支持的最大屏幕出图。小屏会裁掉四周，主体放在画面中间。",[318,709,710,713,721,726,749,752,769,778,781],{"level":320},[322,711,558],{"id":712},"放上-image-view-1",[179,714,715,717,718,720],{},[222,716,567],{}," 拖一个 ",[183,719,571],{}," 到根 View 上。",[179,722,723,725],{},[183,724,542],{}," 里：",[460,727,728,734,742],{},[463,729,730,586,732],{},[183,731,585],{},[222,733,706],{},[463,735,736,586,738,741],{},[183,737,594],{},[183,739,740],{},"Aspect Fill","。图按比例放大，直到盖住整块区域，多出来的边被裁掉",[463,743,744,745,748],{},"勾上 ",[183,746,747],{},"Clip to Bounds","，裁切停在 Image View 自己的边缘",[322,750,751],{"id":751},"四边贴到屏幕",[179,753,754,755,757,758,761,762,765,766,186],{},"选中 Image View，点 ",[183,756,651],{},"。取消 ",[183,759,760],{},"Constrain to margins","，上、下、左、右都填 ",[222,763,764],{},"0","，四条都勾上，点 ",[183,767,768],{},"Add 4 Constraints",[179,770,771,772,774,775,777],{},"大纲里逐条看这些约束，参照项改成 ",[183,773,644],{},"。留在 ",[183,776,640],{}," 上时，刘海和底部横条外面会露出一条底色。",[179,779,780],{},"这四条已经决定宽高，不要再加 Width、Height。多出来的尺寸约束会和四边打架，画布变红。",[179,782,783,784,786],{},"发黄或发红时，同样用 ",[183,785,683],{}," 对齐预览。",[359,788,789,790,792,793,796,797,800],{},"iPhone 和 iPad 的长宽比差一截，同一张图在 iPad 上裁得更多。要两边都好看，在 ",[183,791,585],{}," 旁边点 ",[183,794,795],{},"+","，给 ",[183,798,799],{},"Width: Regular、Height: Regular"," 再指定一张图，这张给 iPad，默认那张留给 iPhone。只做 iPhone 时，一张图就够。",[191,802,224],{"id":803},"uilaunchscreen",[179,805,806,807,809],{},"iOS 14 之后可以不靠 storyboard。启动图写在 Info 的 ",[222,808,224],{}," 字典里，系统只认一个底色和一张图。图按自己的点尺寸画在正中，这里没有约束，也没有 Content Mode。",[179,811,812,813,186],{},"居中 Logo 就是这套键的本来用法。单图铺满也能做：在 Assets 里把图切成可拉伸，系统会把它拉到屏幕边缘。拉满时比例会变。要等比裁切、不变形，用上面 storyboard 的 ",[183,814,740],{},[179,816,817,818,186],{},"两套配置同时在时，系统用 storyboard。切过来之前，先清掉 ",[222,819,310],{},[251,821,253],{"id":822},"配置启动图-1",[318,824,825,829,841,853,857,873,876,932],{"level":320},[322,826,828],{"id":827},"清掉-storyboard","清掉 storyboard",[179,830,831,832,834,835,837,838,840],{},"Target → ",[183,833,331],{}," → ",[183,836,340],{},"，把 ",[183,839,344],{}," 清空。",[179,842,843,844,846,847,849,850,852],{},"Xcode 16 里这个下拉有时清完又弹回来。打开 ",[222,845,259],{},"，删掉 ",[222,848,419],{},"。Info.plist 里如果还有 ",[222,851,310],{},"，一并删掉。",[322,854,856],{"id":855},"加上-launch-screen-字典","加上 Launch Screen 字典",[179,858,831,859,834,862,865,866,868,869,872],{},[183,860,861],{},"Info",[183,863,864],{},"Custom iOS Target Properties","。点 ",[183,867,795],{},"，添加 ",[183,870,871],{},"Launch Screen","，类型选 Dictionary。",[179,874,875],{},"展开后再加子键。居中 Logo 和单图铺满用到这三个：",[198,877,878,891],{},[201,879,880],{},[204,881,882,885,888],{},[207,883,884],{},"界面上的名字",[207,886,887],{},"键",[207,889,890],{},"作用",[214,892,893,906,919],{},[204,894,895,898,903],{},[219,896,897],{},"Background color",[219,899,900],{},[222,901,902],{},"UIColorName",[219,904,905],{},"Assets 里 Color Set 的名字，用来铺底色",[204,907,908,911,916],{},[219,909,910],{},"Image Name",[219,912,913],{},[222,914,915],{},"UIImageName",[219,917,918],{},"Assets 里 Image Set 的名字",[204,920,921,924,929],{},[219,922,923],{},"Image respects safe area insets",[219,925,926],{},[222,927,928],{},"UIImageRespectsSafeAreaInsets",[219,930,931],{},"图是否缩在安全区内",[179,933,934,935,506,938,941],{},"名字和 ",[222,936,937],{},"UIImage(named:)",[222,939,940],{},"UIColor(named:)"," 用的是同一个字符串，不带扩展名。",[262,943,945],{"className":370,"code":944,"language":372,"meta":267,"style":267},"\u003Ckey>UILaunchScreen\u003C\u002Fkey>\n\u003Cdict>\n    \u003Ckey>UIColorName\u003C\u002Fkey>\n    \u003Cstring>LaunchBackground\u003C\u002Fstring>\n    \u003Ckey>UIImageName\u003C\u002Fkey>\n    \u003Cstring>LaunchLogo\u003C\u002Fstring>\n    \u003Ckey>UIImageRespectsSafeAreaInsets\u003C\u002Fkey>\n    \u003Cfalse\u002F>\n\u003C\u002Fdict>\n",[222,946,947,963,972,990,1007,1024,1041,1058,1069],{"__ignoreMap":267},[271,948,949,951,953,955,957,959,961],{"class":273,"line":274},[271,950,379],{"class":281},[271,952,383],{"class":382},[271,954,386],{"class":281},[271,956,224],{"class":277},[271,958,391],{"class":281},[271,960,383],{"class":382},[271,962,396],{"class":281},[271,964,965,967,970],{"class":273,"line":288},[271,966,379],{"class":281},[271,968,969],{"class":382},"dict",[271,971,396],{"class":281},[271,973,975,978,980,982,984,986,988],{"class":273,"line":974},3,[271,976,977],{"class":281},"    \u003C",[271,979,383],{"class":382},[271,981,386],{"class":281},[271,983,902],{"class":277},[271,985,391],{"class":281},[271,987,383],{"class":382},[271,989,396],{"class":281},[271,991,993,995,997,999,1001,1003,1005],{"class":273,"line":992},4,[271,994,977],{"class":281},[271,996,403],{"class":382},[271,998,386],{"class":281},[271,1000,706],{"class":277},[271,1002,391],{"class":281},[271,1004,403],{"class":382},[271,1006,396],{"class":281},[271,1008,1010,1012,1014,1016,1018,1020,1022],{"class":273,"line":1009},5,[271,1011,977],{"class":281},[271,1013,383],{"class":382},[271,1015,386],{"class":281},[271,1017,915],{"class":277},[271,1019,391],{"class":281},[271,1021,383],{"class":382},[271,1023,396],{"class":281},[271,1025,1027,1029,1031,1033,1035,1037,1039],{"class":273,"line":1026},6,[271,1028,977],{"class":281},[271,1030,403],{"class":382},[271,1032,386],{"class":281},[271,1034,501],{"class":277},[271,1036,391],{"class":281},[271,1038,403],{"class":382},[271,1040,396],{"class":281},[271,1042,1044,1046,1048,1050,1052,1054,1056],{"class":273,"line":1043},7,[271,1045,977],{"class":281},[271,1047,383],{"class":382},[271,1049,386],{"class":281},[271,1051,928],{"class":277},[271,1053,391],{"class":281},[271,1055,383],{"class":382},[271,1057,396],{"class":281},[271,1059,1061,1063,1066],{"class":273,"line":1060},8,[271,1062,977],{"class":281},[271,1064,1065],{"class":382},"false",[271,1067,1068],{"class":281},"\u002F>\n",[271,1070,1072,1074,1076],{"class":273,"line":1071},9,[271,1073,391],{"class":281},[271,1075,969],{"class":382},[271,1077,396],{"class":281},[179,1079,1080],{},"工程开了自动生成 Info.plist 时，Info 里这份字典会和生成结果合并。",[359,1082,1083,1084,1086,1087,1090],{},"不写 ",[222,1085,902],{}," 时，底色是系统的 ",[222,1088,1089],{},"systemBackground","，会随浅色、深色模式变。",[251,1092,1094],{"id":1093},"居中-logo-1","居中 Logo",[179,1096,1097],{},"底色加一张不拉伸的图。图出现在屏幕正中，四周是底色。",[179,1099,1100,1101,703,1103,1105,1106,1108,1109,1112,1113,1116],{},"Color Set 起名 ",[222,1102,706],{},[222,1104,501],{},"。显示出来的点宽 = 像素 ÷ scale。想要 120pt 的 Logo，",[222,1107,509],{}," 槽就放 360×360。这张图保持不切片。菜单 ",[183,1110,1111],{},"Editor → Show Slicing"," 里如果已经 ",[183,1114,1115],{},"Start Slicing","，图会被拉满屏幕。",[318,1118,1119,1122,1134,1137,1149],{"level":320},[322,1120,1121],{"id":1121},"写入颜色和图片名",[179,1123,1124,1126,1127,1129,1130,1126,1132,186],{},[183,1125,897],{}," 填 ",[222,1128,706],{},"，",[183,1131,910],{},[222,1133,501],{},[322,1135,1136],{"id":1136},"相对整屏居中",[179,1138,1139,1141,1142,1144,1145,506,1147,186],{},[183,1140,923],{}," 设为 NO。图的中心在整屏中心，对应 storyboard 里相对 ",[183,1143,644],{}," 的 ",[222,1146,630],{},[222,1148,634],{},[179,1150,1151,1152,186],{},"设为 YES 时，中心改到安全区里面。刘海和底部横条会把 Logo 顶偏一点，对应 storyboard 里约束到 ",[183,1153,640],{},[179,1155,1156,1157,1159],{},"透明像素会透出 ",[222,1158,706],{},"。浅色、深色各做一套时，给 Color Set 和 Image Set 都加上 Dark 外观，系统会自己选。",[251,1161,694],{"id":1162},"单图铺满-1",[179,1164,1165,1167],{},[222,1166,915],{}," 指到一张切过片的图时，系统把可拉伸的那一块放大到布局区域的四边。这里选不了 Aspect Fit 或 Aspect Fill。",[179,1169,1170,1171,1173],{},"Image Set 起名 ",[222,1172,706],{},"。按最大的屏幕出图，主体放中间。边缘最好是能被拉开的纯色或简单纹理。",[318,1175,1176,1179,1188,1214,1222,1225,1234],{"level":320},[322,1177,1178],{"id":1178},"把图切成可拉伸",[179,1180,1181,1182,1184,1185,1187],{},"选中槽里的那张图，菜单 ",[183,1183,1111],{},"，点图中间的 ",[183,1186,1115],{},"，选横竖一起切。",[179,1189,539,1190,543,1192,506,1195,506,1198,506,1201,1204,1205,1129,1207,586,1210,1213],{},[183,1191,542],{},[183,1193,1194],{},"Left",[183,1196,1197],{},"Right",[183,1199,1200],{},"Top",[183,1202,1203],{},"Bottom"," 都改成 ",[222,1206,764],{},[183,1208,1209],{},"Center",[183,1211,1212],{},"Stretch","。中间可拉伸区域的宽高设成这张图自己的像素尺寸，标灰的排除区收成 0。灰色部分不会画出来。",[179,1215,1216,1217,506,1219,1221],{},"放了 ",[222,1218,505],{},[222,1220,509],{}," 的话，每个槽都切一次。",[322,1223,1224],{"id":1224},"拉到物理边缘",[179,1226,1227,1126,1229,186,1231,1233],{},[183,1228,910],{},[222,1230,706],{},[183,1232,923],{}," 设为 NO，拉伸区域是整屏。设为 YES 时，图停在安全区里，外面露出底色。",[179,1235,1236],{},"不切片的图只会按点尺寸待在中间。碰巧和某一台手机一样大，换一台就对不齐。",[262,1238,1240],{"className":370,"code":1239,"language":372,"meta":267,"style":267},"\u003Ckey>UILaunchScreen\u003C\u002Fkey>\n\u003Cdict>\n    \u003Ckey>UIImageName\u003C\u002Fkey>\n    \u003Cstring>LaunchBackground\u003C\u002Fstring>\n    \u003Ckey>UIImageRespectsSafeAreaInsets\u003C\u002Fkey>\n    \u003Cfalse\u002F>\n\u003C\u002Fdict>\n",[222,1241,1242,1258,1266,1282,1298,1314,1322],{"__ignoreMap":267},[271,1243,1244,1246,1248,1250,1252,1254,1256],{"class":273,"line":274},[271,1245,379],{"class":281},[271,1247,383],{"class":382},[271,1249,386],{"class":281},[271,1251,224],{"class":277},[271,1253,391],{"class":281},[271,1255,383],{"class":382},[271,1257,396],{"class":281},[271,1259,1260,1262,1264],{"class":273,"line":288},[271,1261,379],{"class":281},[271,1263,969],{"class":382},[271,1265,396],{"class":281},[271,1267,1268,1270,1272,1274,1276,1278,1280],{"class":273,"line":974},[271,1269,977],{"class":281},[271,1271,383],{"class":382},[271,1273,386],{"class":281},[271,1275,915],{"class":277},[271,1277,391],{"class":281},[271,1279,383],{"class":382},[271,1281,396],{"class":281},[271,1283,1284,1286,1288,1290,1292,1294,1296],{"class":273,"line":992},[271,1285,977],{"class":281},[271,1287,403],{"class":382},[271,1289,386],{"class":281},[271,1291,706],{"class":277},[271,1293,391],{"class":281},[271,1295,403],{"class":382},[271,1297,396],{"class":281},[271,1299,1300,1302,1304,1306,1308,1310,1312],{"class":273,"line":1009},[271,1301,977],{"class":281},[271,1303,383],{"class":382},[271,1305,386],{"class":281},[271,1307,928],{"class":277},[271,1309,391],{"class":281},[271,1311,383],{"class":382},[271,1313,396],{"class":281},[271,1315,1316,1318,1320],{"class":273,"line":1026},[271,1317,977],{"class":281},[271,1319,1065],{"class":382},[271,1321,1068],{"class":281},[271,1323,1324,1326,1328],{"class":273,"line":1043},[271,1325,391],{"class":281},[271,1327,969],{"class":382},[271,1329,396],{"class":281},[359,1331,1332,1333,1336,1337,186],{},"九宫格是拉伸。屏幕比例和原图差得多时，画面会变形。选中 Image Set，右侧 ",[183,1334,1335],{},"Devices"," 勾上 iPhone 和 iPad，可以各放一张。照片不能拉的话，用 storyboard 那节的 ",[183,1338,740],{},[191,1340,1341],{"id":1341},"改了图却还是旧的",[179,1343,1344],{},"启动图会被系统缓存。换了资源，模拟器里往往还是上一张。",[179,1346,1347],{},"按这个顺序清：",[1349,1350,1351,1354,1366],"ol",{},[463,1352,1353],{},"在模拟器里删掉 App",[463,1355,1356,1357,834,1360,564,1363,241],{},"Xcode 菜单 ",[183,1358,1359],{},"Product",[183,1361,1362],{},"Clean Build Folder",[222,1364,1365],{},"Shift + Cmd + K",[463,1367,1368,1369],{},"重新 ",[222,1370,1371],{},"Cmd + R",[179,1373,1374,1375,834,1378,1381],{},"还是旧图的话，用模拟器菜单 ",[183,1376,1377],{},"Device",[183,1379,1380],{},"Erase All Content and Settings...","，或者直接重启模拟器。真机上删掉 App 之后，有时还要重启手机。",[179,1383,1384,1385,1387],{},"只换像素、资源名不变时，缓存更顽固。把 Image Set 改个名字，",[183,1386,861],{}," 或 storyboard 里的引用一起改掉，一般就能看到新图。",[191,1389,1390],{"id":1390},"和第一个界面接上",[179,1392,1393],{},"启动图停留的时间很短。它和根控制器差得太多，中间会闪一下。",[179,1395,1396,1397,1400,1401,1404],{},"底色、Logo 的位置尽量和 ",[222,1398,1399],{},"ViewController"," 第一帧一样。需要一段品牌动画时，在根控制器里用同一张图当第一帧，等 ",[222,1402,1403],{},"viewDidAppear"," 再动。动画写在启动图上不会执行。",[179,1406,1407,1408,1411,1412,1415],{},"根控制器怎么挂，还是看 ",[1409,1410,13],"a",{"href":14}," 里 ",[222,1413,1414],{},"SceneDelegate"," 那一段。",[1417,1418,1419],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":267,"searchDepth":288,"depth":288,"links":1421},[1422,1423,1428,1433,1434],{"id":193,"depth":288,"text":193},{"id":244,"depth":288,"text":244,"children":1424},[1425,1426,1427],{"id":253,"depth":974,"text":253},{"id":477,"depth":974,"text":1094},{"id":694,"depth":974,"text":694},{"id":803,"depth":288,"text":224,"children":1429},[1430,1431,1432],{"id":822,"depth":974,"text":253},{"id":1093,"depth":974,"text":1094},{"id":1162,"depth":974,"text":694},{"id":1341,"depth":288,"text":1341},{"id":1390,"depth":288,"text":1390},"在 Xcode 16 里给 UIKit 项目换启动图。Info 里的 UILaunchScreen 和 LaunchScreen.storyboard 都能做纯色背景、居中 Logo 或整张铺满。","md",[1438,1440,1445],{"label":1439,"icon":109,"to":14},"UIKit 起步笔记",{"label":1441,"icon":1442,"to":1443,"target":1444},"Specifying launch screen","i-lucide-book-open","https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fxcode\u002Fspecifying-your-apps-launch-screen","_blank",{"label":224,"icon":1446,"to":1447,"target":1444},"i-lucide-list","https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fbundleresources\u002Finformation-property-list\u002Fuilaunchscreen",{"date":1449,"categories":1450,"tags":1452},"2026-09-28",[1451],"ios",[108,1453,1454,1455],"UIKit","Xcode","启动图",{"icon":124},{"title":1458,"description":1459},"给 iOS 项目设置启动图","Xcode 16 下用 UILaunchScreen 或 LaunchScreen.storyboard 设置启动图，纯色背景、居中 Logo、整张铺满都可以。顺手记下启动图缓存，以及 Xcode 16 里启动图文件名存不进去的坑。","12K6nJlhsWzmL7Ez6wBgZtDo-KPEcYlkcUTmJgziYzU",[1462,1464],{"title":116,"path":117,"stem":118,"description":1463,"icon":119},"先记 Swift 闭包：本质与 copy、变量捕获、循环引用，以及和 Delegate、通知怎么选。",{"title":126,"path":127,"stem":128,"description":1465,"icon":48},"UIKit 用导航控制器上的页面栈管跳转，SwiftUI 用 NavigationStack 的 path 管跳转。两边都收成一个 Router，目的地用枚举。",1790767047729]