iOS Export: add option to use storyboard for launch screen
This commit is contained in:
parent
1ebfe84458
commit
46c6383c8d
|
@ -14,6 +14,7 @@
|
|||
D07CD44E1C5D589C00B7FB28 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D07CD44D1C5D589C00B7FB28 /* Images.xcassets */; };
|
||||
D0BCFE4618AEBDA2004A7AAE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D0BCFE4418AEBDA2004A7AAE /* InfoPlist.strings */; };
|
||||
D0BCFE7818AEBFEB004A7AAE /* $binary.pck in Resources */ = {isa = PBXBuildFile; fileRef = D0BCFE7718AEBFEB004A7AAE /* $binary.pck */; };
|
||||
$pbx_launch_screen_build_reference
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
|
@ -41,6 +42,7 @@
|
|||
D0BCFE4318AEBDA2004A7AAE /* $binary-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "$binary-Info.plist"; sourceTree = "<group>"; };
|
||||
D0BCFE4518AEBDA2004A7AAE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
D0BCFE7718AEBFEB004A7AAE /* $binary.pck */ = {isa = PBXFileReference; lastKnownFileType = file; path = "$binary.pck"; sourceTree = "<group>"; };
|
||||
$pbx_launch_screen_file_reference
|
||||
/* End PBXFileReference section */
|
||||
|
||||
$additional_pbx_files
|
||||
|
@ -92,6 +94,7 @@
|
|||
D0BCFE4118AEBDA2004A7AAE /* $binary */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
$pbx_launch_screen_copy_files
|
||||
1FF4C1881F584E6300A41E41 /* $binary.entitlements */,
|
||||
D07CD44D1C5D589C00B7FB28 /* Images.xcassets */,
|
||||
D0BCFE4218AEBDA2004A7AAE /* Supporting Files */,
|
||||
|
@ -247,6 +250,7 @@
|
|||
files = (
|
||||
D07CD44E1C5D589C00B7FB28 /* Images.xcassets in Resources */,
|
||||
D0BCFE7818AEBFEB004A7AAE /* $binary.pck in Resources */,
|
||||
$pbx_launch_screen_build_phase
|
||||
D0BCFE4618AEBDA2004A7AAE /* InfoPlist.strings in Resources */,
|
||||
$additional_pbx_resources_build
|
||||
);
|
||||
|
@ -367,7 +371,7 @@
|
|||
buildSettings = {
|
||||
ARCHS = "$godot_archs";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
||||
$pbx_launch_image_usage_setting
|
||||
CODE_SIGN_ENTITLEMENTS = "$binary/$binary.entitlements";
|
||||
CODE_SIGN_IDENTITY = "$code_sign_identity_debug";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "$code_sign_identity_debug";
|
||||
|
@ -397,7 +401,7 @@
|
|||
buildSettings = {
|
||||
ARCHS = "$godot_archs";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
||||
$pbx_launch_image_usage_setting
|
||||
CODE_SIGN_ENTITLEMENTS = "$binary/$binary.entitlements";
|
||||
CODE_SIGN_IDENTITY = "$code_sign_identity_release";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "$code_sign_identity_release";
|
||||
|
|
22
misc/dist/ios_xcode/godot_ios/Images.xcassets/SplashImage.imageset/Contents.json
vendored
Normal file
22
misc/dist/ios_xcode/godot_ios/Images.xcassets/SplashImage.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "splash@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "splash@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
BIN
misc/dist/ios_xcode/godot_ios/Images.xcassets/SplashImage.imageset/splash@2x.png
vendored
Normal file
BIN
misc/dist/ios_xcode/godot_ios/Images.xcassets/SplashImage.imageset/splash@2x.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
BIN
misc/dist/ios_xcode/godot_ios/Images.xcassets/SplashImage.imageset/splash@3x.png
vendored
Normal file
BIN
misc/dist/ios_xcode/godot_ios/Images.xcassets/SplashImage.imageset/splash@3x.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
|
@ -0,0 +1,41 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||
<device id="retina6_1" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--View Controller-->
|
||||
<scene sceneID="EHf-IW-A2E">
|
||||
<objects>
|
||||
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="$launch_screen_image_mode" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="SplashImage" translatesAutoresizingMaskIntoConstraints="NO" id="tjZ-vn-Lsv">
|
||||
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
|
||||
</imageView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" $launch_screen_background_color colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="tjZ-vn-Lsv" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="Ak7-I4-yrQ"/>
|
||||
<constraint firstAttribute="trailing" secondItem="tjZ-vn-Lsv" secondAttribute="trailing" id="Fon-JO-5cz"/>
|
||||
<constraint firstItem="tjZ-vn-Lsv" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="bkx-rj-PKc"/>
|
||||
<constraint firstAttribute="bottom" secondItem="tjZ-vn-Lsv" secondAttribute="bottom" id="yjq-MJ-tym"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="52.173913043478265" y="375"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
<resources>
|
||||
<image name="SplashImage" width="266.66665649414062" height="200"/>
|
||||
</resources>
|
||||
</document>
|
|
@ -57,5 +57,6 @@
|
|||
$interface_orientations
|
||||
</array>
|
||||
$additional_plist_content
|
||||
$plist_launch_screen_name
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "editor/editor_export.h"
|
||||
#include "editor/editor_node.h"
|
||||
#include "editor/editor_settings.h"
|
||||
#include "main/splash.gen.h"
|
||||
#include "platform/iphone/logo.gen.h"
|
||||
#include "string.h"
|
||||
|
||||
|
@ -93,7 +94,8 @@ class EditorExportPlatformIOS : public EditorExportPlatform {
|
|||
String _get_linker_flags();
|
||||
String _get_cpp_code();
|
||||
void _fix_config_file(const Ref<EditorExportPreset> &p_preset, Vector<uint8_t> &pfile, const IOSConfigData &p_config, bool p_debug);
|
||||
Error _export_loading_screens(const Ref<EditorExportPreset> &p_preset, const String &p_dest_dir);
|
||||
Error _export_loading_screen_images(const Ref<EditorExportPreset> &p_preset, const String &p_dest_dir);
|
||||
Error _export_loading_screen_file(const Ref<EditorExportPreset> &p_preset, const String &p_dest_dir);
|
||||
Error _export_icons(const Ref<EditorExportPreset> &p_preset, const String &p_iconset_dir);
|
||||
|
||||
Vector<ExportArchitecture> _get_supported_architectures();
|
||||
|
@ -257,6 +259,8 @@ void EditorExportPlatformIOS::get_export_options(List<ExportOption> *r_options)
|
|||
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "optional_icons/spotlight_40x40", PROPERTY_HINT_FILE, "*.png"), "")); // Spotlight
|
||||
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "optional_icons/spotlight_80x80", PROPERTY_HINT_FILE, "*.png"), "")); // Spotlight on devices with retina display
|
||||
|
||||
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "storyboard/use_launch_screen_storyboard"), false));
|
||||
|
||||
for (uint64_t i = 0; i < sizeof(loading_screen_infos) / sizeof(loading_screen_infos[0]); ++i) {
|
||||
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, loading_screen_infos[i].preset_key, PROPERTY_HINT_FILE, "*.png"), ""));
|
||||
}
|
||||
|
@ -390,6 +394,48 @@ void EditorExportPlatformIOS::_fix_config_file(const Ref<EditorExportPreset> &p_
|
|||
} else if (lines[i].find("$photolibrary_usage_description") != -1) {
|
||||
String description = p_preset->get("privacy/photolibrary_usage_description");
|
||||
strnew += lines[i].replace("$photolibrary_usage_description", description) + "\n";
|
||||
} else if (lines[i].find("$plist_launch_screen_name") != -1) {
|
||||
bool is_on = p_preset->get("storyboard/use_launch_screen_storyboard");
|
||||
String value = is_on ? "<key>UILaunchStoryboardName</key>\n<string>Launch Screen</string>" : "";
|
||||
strnew += lines[i].replace("$plist_launch_screen_name", value) + "\n";
|
||||
} else if (lines[i].find("$pbx_launch_screen_file_reference") != -1) {
|
||||
bool is_on = p_preset->get("storyboard/use_launch_screen_storyboard");
|
||||
String value = is_on ? "90DD2D9D24B36E8000717FE1 = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = \"Launch Screen.storyboard\"; sourceTree = \"<group>\"; };" : "";
|
||||
strnew += lines[i].replace("$pbx_launch_screen_file_reference", value) + "\n";
|
||||
} else if (lines[i].find("$pbx_launch_screen_copy_files") != -1) {
|
||||
bool is_on = p_preset->get("storyboard/use_launch_screen_storyboard");
|
||||
String value = is_on ? "90DD2D9D24B36E8000717FE1 /* Launch Screen.storyboard */," : "";
|
||||
strnew += lines[i].replace("$pbx_launch_screen_copy_files", value) + "\n";
|
||||
} else if (lines[i].find("$pbx_launch_screen_build_phase") != -1) {
|
||||
bool is_on = p_preset->get("storyboard/use_launch_screen_storyboard");
|
||||
String value = is_on ? "90DD2D9E24B36E8000717FE1 /* Launch Screen.storyboard in Resources */," : "";
|
||||
strnew += lines[i].replace("$pbx_launch_screen_build_phase", value) + "\n";
|
||||
} else if (lines[i].find("$pbx_launch_screen_build_reference") != -1) {
|
||||
bool is_on = p_preset->get("storyboard/use_launch_screen_storyboard");
|
||||
String value = is_on ? "90DD2D9E24B36E8000717FE1 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 90DD2D9D24B36E8000717FE1 /* Launch Screen.storyboard */; };" : "";
|
||||
strnew += lines[i].replace("$pbx_launch_screen_build_reference", value) + "\n";
|
||||
} else if (lines[i].find("$pbx_launch_image_usage_setting") != -1) {
|
||||
bool is_on = p_preset->get("storyboard/use_launch_screen_storyboard");
|
||||
String value = is_on ? "" : "ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;";
|
||||
strnew += lines[i].replace("$pbx_launch_image_usage_setting", value) + "\n";
|
||||
} else if (lines[i].find("$launch_screen_image_mode") != -1) {
|
||||
String logo_path = ProjectSettings::get_singleton()->get("application/boot_splash/image");
|
||||
bool is_on = ProjectSettings::get_singleton()->get("application/boot_splash/fullsize");
|
||||
// If custom logo is not specified, Godot does not scale default one, so we should do the same.
|
||||
String value = (is_on && logo_path.length() > 0) ? "scaleAspectFit" : "center";
|
||||
strnew += lines[i].replace("$launch_screen_image_mode", value) + "\n";
|
||||
} else if (lines[i].find("$launch_screen_background_color") != -1) {
|
||||
Color color = ProjectSettings::get_singleton()->get("application/boot_splash/bg_color");
|
||||
const String value_format = "red=\"$red\" green=\"$green\" blue=\"$blue\" alpha=\"$alpha\"";
|
||||
|
||||
Dictionary value_dictionary;
|
||||
value_dictionary["red"] = color.r;
|
||||
value_dictionary["green"] = color.g;
|
||||
value_dictionary["blue"] = color.b;
|
||||
value_dictionary["alpha"] = color.a;
|
||||
String value = value_format.format(value_dictionary, "$_");
|
||||
|
||||
strnew += lines[i].replace("$launch_screen_background_color", value) + "\n";
|
||||
} else {
|
||||
strnew += lines[i] + "\n";
|
||||
}
|
||||
|
@ -520,7 +566,42 @@ Error EditorExportPlatformIOS::_export_icons(const Ref<EditorExportPreset> &p_pr
|
|||
return OK;
|
||||
}
|
||||
|
||||
Error EditorExportPlatformIOS::_export_loading_screens(const Ref<EditorExportPreset> &p_preset, const String &p_dest_dir) {
|
||||
Error EditorExportPlatformIOS::_export_loading_screen_file(const Ref<EditorExportPreset> &p_preset, const String &p_dest_dir) {
|
||||
Ref<Image> splash;
|
||||
|
||||
const String splash_path = ProjectSettings::get_singleton()->get("application/boot_splash/image");
|
||||
|
||||
if (!splash_path.empty()) {
|
||||
splash.instance();
|
||||
const Error err = splash->load(splash_path);
|
||||
if (err) {
|
||||
splash.unref();
|
||||
}
|
||||
}
|
||||
|
||||
if (splash.is_null()) {
|
||||
splash = Ref<Image>(memnew(Image(boot_splash_png)));
|
||||
}
|
||||
|
||||
// Using same image for both @2x and @3x
|
||||
// because Godot's own boot logo uses single image for all resolutions.
|
||||
// Also not using @1x image, because devices using this image variant
|
||||
// are not supported by iOS 9, which is minimal target.
|
||||
const String splash_png_path_2x = p_dest_dir.plus_file("splash@2x.png");
|
||||
const String splash_png_path_3x = p_dest_dir.plus_file("splash@3x.png");
|
||||
|
||||
if (splash->save_png(splash_png_path_2x) != OK) {
|
||||
return ERR_FILE_CANT_WRITE;
|
||||
}
|
||||
|
||||
if (splash->save_png(splash_png_path_3x) != OK) {
|
||||
return ERR_FILE_CANT_WRITE;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
Error EditorExportPlatformIOS::_export_loading_screen_images(const Ref<EditorExportPreset> &p_preset, const String &p_dest_dir) {
|
||||
DirAccess *da = DirAccess::open(p_dest_dir);
|
||||
ERR_FAIL_COND_V_MSG(!da, ERR_CANT_OPEN, "Cannot open directory '" + p_dest_dir + "'.");
|
||||
|
||||
|
@ -1038,6 +1119,7 @@ Error EditorExportPlatformIOS::export_project(const Ref<EditorExportPreset> &p_p
|
|||
files_to_parse.insert("godot_ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata");
|
||||
files_to_parse.insert("godot_ios.xcodeproj/xcshareddata/xcschemes/godot_ios.xcscheme");
|
||||
files_to_parse.insert("godot_ios/godot_ios.entitlements");
|
||||
files_to_parse.insert("godot_ios/Launch Screen.storyboard");
|
||||
|
||||
IOSConfigData config_data = {
|
||||
pkg_name,
|
||||
|
@ -1211,9 +1293,46 @@ Error EditorExportPlatformIOS::export_project(const Ref<EditorExportPreset> &p_p
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
err = _export_loading_screens(p_preset, dest_dir + binary_name + "/Images.xcassets/LaunchImage.launchimage/");
|
||||
if (err)
|
||||
bool use_storyboard = p_preset->get("storyboard/use_launch_screen_storyboard");
|
||||
|
||||
String launch_image_path = dest_dir + binary_name + "/Images.xcassets/LaunchImage.launchimage/";
|
||||
String splash_image_path = dest_dir + binary_name + "/Images.xcassets/SplashImage.imageset/";
|
||||
|
||||
DirAccess *launch_screen_da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
|
||||
|
||||
if (!launch_screen_da) {
|
||||
return ERR_CANT_CREATE;
|
||||
}
|
||||
|
||||
if (use_storyboard) {
|
||||
print_line("Using Launch Storyboard");
|
||||
|
||||
if (launch_screen_da->change_dir(launch_image_path) == OK) {
|
||||
launch_screen_da->erase_contents_recursive();
|
||||
launch_screen_da->remove(launch_image_path);
|
||||
}
|
||||
|
||||
err = _export_loading_screen_file(p_preset, splash_image_path);
|
||||
} else {
|
||||
print_line("Using Launch Images");
|
||||
|
||||
const String launch_screen_path = dest_dir + binary_name + "/Launch Screen.storyboard";
|
||||
|
||||
launch_screen_da->remove(launch_screen_path);
|
||||
|
||||
if (launch_screen_da->change_dir(splash_image_path) == OK) {
|
||||
launch_screen_da->erase_contents_recursive();
|
||||
launch_screen_da->remove(splash_image_path);
|
||||
}
|
||||
|
||||
err = _export_loading_screen_images(p_preset, launch_image_path);
|
||||
}
|
||||
|
||||
memdelete(launch_screen_da);
|
||||
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
print_line("Exporting additional assets");
|
||||
Vector<IOSExportAsset> assets;
|
||||
|
|
Loading…
Reference in New Issue