Add tvOS Target

This commit is contained in:
Michele Gruppioni 2018-02-17 16:14:53 +01:00 committed by Reda Lemeden
parent f94ff45a9d
commit fefa984414
16 changed files with 521 additions and 2 deletions

View File

@ -8,7 +8,10 @@ Pod::Spec.new do |s|
s.author = { "Reda Lemeden" => "git@kaishin.haz.email" } s.author = { "Reda Lemeden" => "git@kaishin.haz.email" }
s.source = { :git => "https://github.com/kaishin/Gifu.git", :tag => "v#{s.version}", :submodules => true } s.source = { :git => "https://github.com/kaishin/Gifu.git", :tag => "v#{s.version}", :submodules => true }
s.platform = :ios, "9.0" s.platform = :ios, "9.0"
s.platform = :tvos, "9.0"
s.ios.source_files = "Source/**/*.{h,swift}" s.ios.source_files = "Source/**/*.{h,swift}"
s.tvos.source_files = "Source/**/*.{h,swift}"
s.requires_arc = true s.requires_arc = true
s.ios.deployment_target = "9.0" s.ios.deployment_target = "9.0"
s.tvos.deployment_target = "9.0"
end end

View File

@ -20,6 +20,21 @@
00B8C7961A3650EE00C188E7 /* Gifu.h in Headers */ = {isa = PBXBuildFile; fileRef = 00B8C7951A3650EE00C188E7 /* Gifu.h */; settings = {ATTRIBUTES = (Public, ); }; }; 00B8C7961A3650EE00C188E7 /* Gifu.h in Headers */ = {isa = PBXBuildFile; fileRef = 00B8C7951A3650EE00C188E7 /* Gifu.h */; settings = {ATTRIBUTES = (Public, ); }; };
00BF42CC1D99A1DC00C6F28D /* GIFAnimatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00BF42CB1D99A1DC00C6F28D /* GIFAnimatable.swift */; }; 00BF42CC1D99A1DC00C6F28D /* GIFAnimatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00BF42CB1D99A1DC00C6F28D /* GIFAnimatable.swift */; };
00DD26EE1DA9643800A0F683 /* UIImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00DD26ED1DA9643800A0F683 /* UIImageView.swift */; }; 00DD26EE1DA9643800A0F683 /* UIImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00DD26ED1DA9643800A0F683 /* UIImageView.swift */; };
71E8B2E620387D830037BA62 /* Gifu_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 71E8B2DD20387D830037BA62 /* Gifu_tvOS.framework */; };
71E8B2ED20387D830037BA62 /* Gifu_tvOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 71E8B2DF20387D830037BA62 /* Gifu_tvOS.h */; settings = {ATTRIBUTES = (Public, ); }; };
71E8B2F420387D8E0037BA62 /* AnimatedFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF49CB01A3B6EEB00B395DF /* AnimatedFrame.swift */; };
71E8B2F520387D8E0037BA62 /* Animator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00978B6B1D9C6D2A00A6575F /* Animator.swift */; };
71E8B2F620387D8E0037BA62 /* FrameStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 005656EC1A6F14D6008A0ED1 /* FrameStore.swift */; };
71E8B2F720387D8E0037BA62 /* GIFAnimatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00BF42CB1D99A1DC00C6F28D /* GIFAnimatable.swift */; };
71E8B2F820387D8E0037BA62 /* GIFImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 005656EE1A6F1C26008A0ED1 /* GIFImageView.swift */; };
71E8B2F920387D910037BA62 /* Array.swift in Sources */ = {isa = PBXBuildFile; fileRef = 007E08431BD95E6200883D0C /* Array.swift */; };
71E8B2FA20387D910037BA62 /* CGSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 009BD1431BBC93C800FC982B /* CGSize.swift */; };
71E8B2FB20387D910037BA62 /* UIImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF49C7E1A3A4DE000B395DF /* UIImage.swift */; };
71E8B2FC20387D910037BA62 /* UIImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00DD26ED1DA9643800A0F683 /* UIImageView.swift */; };
71E8B2FD20387D950037BA62 /* ImageSourceHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00B8C75C1A364DCE00C188E7 /* ImageSourceHelpers.swift */; };
71E8B30220387E1E0037BA62 /* nailed.gif in Resources */ = {isa = PBXBuildFile; fileRef = 71E8B30020387E1E0037BA62 /* nailed.gif */; };
71E8B30320387E1E0037BA62 /* mugen.gif in Resources */ = {isa = PBXBuildFile; fileRef = 71E8B30120387E1E0037BA62 /* mugen.gif */; };
71E8B30420387ED70037BA62 /* Gifu_tvOSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71E8B2CE20387CE60037BA62 /* Gifu_tvOSTests.swift */; };
EAF49C7F1A3A4DE000B395DF /* UIImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF49C7E1A3A4DE000B395DF /* UIImage.swift */; }; EAF49C7F1A3A4DE000B395DF /* UIImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF49C7E1A3A4DE000B395DF /* UIImage.swift */; };
EAF49CB11A3B6EEB00B395DF /* AnimatedFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF49CB01A3B6EEB00B395DF /* AnimatedFrame.swift */; }; EAF49CB11A3B6EEB00B395DF /* AnimatedFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF49CB01A3B6EEB00B395DF /* AnimatedFrame.swift */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
@ -32,6 +47,13 @@
remoteGlobalIDString = 00B8C73D1A364DA400C188E7; remoteGlobalIDString = 00B8C73D1A364DA400C188E7;
remoteInfo = Gifu; remoteInfo = Gifu;
}; };
71E8B2E720387D830037BA62 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 00B8C7351A364DA400C188E7 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 71E8B2DC20387D830037BA62;
remoteInfo = Gifu_tvOS;
};
/* End PBXContainerItemProxy section */ /* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
@ -51,6 +73,15 @@
00B8C7951A3650EE00C188E7 /* Gifu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Gifu.h; sourceTree = "<group>"; }; 00B8C7951A3650EE00C188E7 /* Gifu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Gifu.h; sourceTree = "<group>"; };
00BF42CB1D99A1DC00C6F28D /* GIFAnimatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GIFAnimatable.swift; sourceTree = "<group>"; }; 00BF42CB1D99A1DC00C6F28D /* GIFAnimatable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GIFAnimatable.swift; sourceTree = "<group>"; };
00DD26ED1DA9643800A0F683 /* UIImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageView.swift; sourceTree = "<group>"; }; 00DD26ED1DA9643800A0F683 /* UIImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageView.swift; sourceTree = "<group>"; };
71E8B2B82038784C0037BA62 /* Gifu_tvOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Gifu_tvOS-Info.plist"; path = "/Users/gruppionim/Documents/Developer/Github/Gifu/Gifu_tvOS-Info.plist"; sourceTree = "<absolute>"; };
71E8B2CE20387CE60037BA62 /* Gifu_tvOSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Gifu_tvOSTests.swift; sourceTree = "<group>"; };
71E8B2D020387CE60037BA62 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
71E8B2DD20387D830037BA62 /* Gifu_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Gifu_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
71E8B2DF20387D830037BA62 /* Gifu_tvOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Gifu_tvOS.h; sourceTree = "<group>"; };
71E8B2E020387D830037BA62 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
71E8B2E520387D830037BA62 /* Gifu_tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Gifu_tvOSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
71E8B30020387E1E0037BA62 /* nailed.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = nailed.gif; sourceTree = "<group>"; };
71E8B30120387E1E0037BA62 /* mugen.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = mugen.gif; sourceTree = "<group>"; };
EAF49C7E1A3A4DE000B395DF /* UIImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImage.swift; sourceTree = "<group>"; }; EAF49C7E1A3A4DE000B395DF /* UIImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImage.swift; sourceTree = "<group>"; };
EAF49CB01A3B6EEB00B395DF /* AnimatedFrame.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnimatedFrame.swift; sourceTree = "<group>"; }; EAF49CB01A3B6EEB00B395DF /* AnimatedFrame.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnimatedFrame.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
@ -71,6 +102,21 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
71E8B2D920387D830037BA62 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
71E8B2E220387D830037BA62 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
71E8B2E620387D830037BA62 /* Gifu_tvOS.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
@ -128,9 +174,12 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
009BD1371BBC7F6500FC982B /* GifuTests */, 009BD1371BBC7F6500FC982B /* GifuTests */,
71E8B2CD20387CE60037BA62 /* Gifu_tvOSTests */,
71E8B2DE20387D830037BA62 /* Gifu_tvOS */,
00B8C73F1A364DA400C188E7 /* Products */, 00B8C73F1A364DA400C188E7 /* Products */,
00B8C75A1A364DBE00C188E7 /* Source */, 00B8C75A1A364DBE00C188E7 /* Source */,
00B8C7411A364DA400C188E7 /* Supporting Files */, 00B8C7411A364DA400C188E7 /* Supporting Files */,
71E8B2B82038784C0037BA62 /* Gifu_tvOS-Info.plist */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@ -139,6 +188,8 @@
children = ( children = (
00B8C73E1A364DA400C188E7 /* Gifu.framework */, 00B8C73E1A364DA400C188E7 /* Gifu.framework */,
009BD1361BBC7F6500FC982B /* GifuTests.xctest */, 009BD1361BBC7F6500FC982B /* GifuTests.xctest */,
71E8B2DD20387D830037BA62 /* Gifu_tvOS.framework */,
71E8B2E520387D830037BA62 /* Gifu_tvOSTests.xctest */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
@ -162,6 +213,35 @@
path = Source; path = Source;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
71E8B2CD20387CE60037BA62 /* Gifu_tvOSTests */ = {
isa = PBXGroup;
children = (
71E8B2FF20387E1E0037BA62 /* Images */,
71E8B2CE20387CE60037BA62 /* Gifu_tvOSTests.swift */,
71E8B2D020387CE60037BA62 /* Info.plist */,
);
path = Gifu_tvOSTests;
sourceTree = "<group>";
};
71E8B2DE20387D830037BA62 /* Gifu_tvOS */ = {
isa = PBXGroup;
children = (
71E8B2DF20387D830037BA62 /* Gifu_tvOS.h */,
71E8B2E020387D830037BA62 /* Info.plist */,
);
path = Gifu_tvOS;
sourceTree = "<group>";
};
71E8B2FF20387E1E0037BA62 /* Images */ = {
isa = PBXGroup;
children = (
71E8B30020387E1E0037BA62 /* nailed.gif */,
71E8B30120387E1E0037BA62 /* mugen.gif */,
);
name = Images;
path = GifuTests/Images;
sourceTree = SOURCE_ROOT;
};
/* End PBXGroup section */ /* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */ /* Begin PBXHeadersBuildPhase section */
@ -173,6 +253,14 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
71E8B2DA20387D830037BA62 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
71E8B2ED20387D830037BA62 /* Gifu_tvOS.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */ /* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
@ -213,13 +301,49 @@
productReference = 00B8C73E1A364DA400C188E7 /* Gifu.framework */; productReference = 00B8C73E1A364DA400C188E7 /* Gifu.framework */;
productType = "com.apple.product-type.framework"; productType = "com.apple.product-type.framework";
}; };
71E8B2DC20387D830037BA62 /* Gifu_tvOS */ = {
isa = PBXNativeTarget;
buildConfigurationList = 71E8B2EE20387D830037BA62 /* Build configuration list for PBXNativeTarget "Gifu_tvOS" */;
buildPhases = (
71E8B2D820387D830037BA62 /* Sources */,
71E8B2D920387D830037BA62 /* Frameworks */,
71E8B2DA20387D830037BA62 /* Headers */,
71E8B2DB20387D830037BA62 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = Gifu_tvOS;
productName = Gifu_tvOS;
productReference = 71E8B2DD20387D830037BA62 /* Gifu_tvOS.framework */;
productType = "com.apple.product-type.framework";
};
71E8B2E420387D830037BA62 /* Gifu_tvOSTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 71E8B2F120387D830037BA62 /* Build configuration list for PBXNativeTarget "Gifu_tvOSTests" */;
buildPhases = (
71E8B2E120387D830037BA62 /* Sources */,
71E8B2E220387D830037BA62 /* Frameworks */,
71E8B2E320387D830037BA62 /* Resources */,
);
buildRules = (
);
dependencies = (
71E8B2E820387D830037BA62 /* PBXTargetDependency */,
);
name = Gifu_tvOSTests;
productName = Gifu_tvOSTests;
productReference = 71E8B2E520387D830037BA62 /* Gifu_tvOSTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
/* End PBXNativeTarget section */ /* End PBXNativeTarget section */
/* Begin PBXProject section */ /* Begin PBXProject section */
00B8C7351A364DA400C188E7 /* Project object */ = { 00B8C7351A364DA400C188E7 /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastSwiftUpdateCheck = 0700; LastSwiftUpdateCheck = 0920;
LastUpgradeCheck = 0900; LastUpgradeCheck = 0900;
ORGANIZATIONNAME = "Kaishin & Co"; ORGANIZATIONNAME = "Kaishin & Co";
TargetAttributes = { TargetAttributes = {
@ -232,6 +356,14 @@
LastSwiftMigration = 0900; LastSwiftMigration = 0900;
ProvisioningStyle = Manual; ProvisioningStyle = Manual;
}; };
71E8B2DC20387D830037BA62 = {
CreatedOnToolsVersion = 9.2;
ProvisioningStyle = Automatic;
};
71E8B2E420387D830037BA62 = {
CreatedOnToolsVersion = 9.2;
ProvisioningStyle = Automatic;
};
}; };
}; };
buildConfigurationList = 00B8C7381A364DA400C188E7 /* Build configuration list for PBXProject "Gifu" */; buildConfigurationList = 00B8C7381A364DA400C188E7 /* Build configuration list for PBXProject "Gifu" */;
@ -248,6 +380,8 @@
targets = ( targets = (
00B8C73D1A364DA400C188E7 /* Gifu */, 00B8C73D1A364DA400C188E7 /* Gifu */,
009BD1351BBC7F6500FC982B /* GifuTests */, 009BD1351BBC7F6500FC982B /* GifuTests */,
71E8B2DC20387D830037BA62 /* Gifu_tvOS */,
71E8B2E420387D830037BA62 /* Gifu_tvOSTests */,
); );
}; };
/* End PBXProject section */ /* End PBXProject section */
@ -269,6 +403,22 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
71E8B2DB20387D830037BA62 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
71E8B2E320387D830037BA62 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
71E8B30220387E1E0037BA62 /* nailed.gif in Resources */,
71E8B30320387E1E0037BA62 /* mugen.gif in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
@ -314,6 +464,31 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
71E8B2D820387D830037BA62 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
71E8B2FD20387D950037BA62 /* ImageSourceHelpers.swift in Sources */,
71E8B2F820387D8E0037BA62 /* GIFImageView.swift in Sources */,
71E8B2FC20387D910037BA62 /* UIImageView.swift in Sources */,
71E8B2FB20387D910037BA62 /* UIImage.swift in Sources */,
71E8B2F520387D8E0037BA62 /* Animator.swift in Sources */,
71E8B2F620387D8E0037BA62 /* FrameStore.swift in Sources */,
71E8B2FA20387D910037BA62 /* CGSize.swift in Sources */,
71E8B2F920387D910037BA62 /* Array.swift in Sources */,
71E8B2F720387D8E0037BA62 /* GIFAnimatable.swift in Sources */,
71E8B2F420387D8E0037BA62 /* AnimatedFrame.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
71E8B2E120387D830037BA62 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
71E8B30420387ED70037BA62 /* Gifu_tvOSTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */ /* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */ /* Begin PBXTargetDependency section */
@ -322,6 +497,11 @@
target = 00B8C73D1A364DA400C188E7 /* Gifu */; target = 00B8C73D1A364DA400C188E7 /* Gifu */;
targetProxy = 009BD13C1BBC7F6500FC982B /* PBXContainerItemProxy */; targetProxy = 009BD13C1BBC7F6500FC982B /* PBXContainerItemProxy */;
}; };
71E8B2E820387D830037BA62 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 71E8B2DC20387D830037BA62 /* Gifu_tvOS */;
targetProxy = 71E8B2E720387D830037BA62 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */ /* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */ /* Begin XCBuildConfiguration section */
@ -509,6 +689,116 @@
}; };
name = Release; name = Release;
}; };
71E8B2EF20387D830037BA62 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_IDENTITY = "";
CODE_SIGN_STYLE = Automatic;
DEBUG_INFORMATION_FORMAT = dwarf;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = Gifu_tvOS/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "co.kaishin.gifu.Gifu-tvOS";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = appletvos;
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = 3;
TVOS_DEPLOYMENT_TARGET = 11.2;
};
name = Debug;
};
71E8B2F020387D830037BA62 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_IDENTITY = "";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = Gifu_tvOS/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "co.kaishin.gifu.Gifu-tvOS";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = appletvos;
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = 3;
TVOS_DEPLOYMENT_TARGET = 11.2;
};
name = Release;
};
71E8B2F220387D830037BA62 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic;
DEBUG_INFORMATION_FORMAT = dwarf;
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = Gifu_tvOSTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "co.kaishin.gifu.Gifu-tvOSTests";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = appletvos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = 3;
TVOS_DEPLOYMENT_TARGET = 11.2;
};
name = Debug;
};
71E8B2F320387D830037BA62 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = Gifu_tvOSTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "co.kaishin.gifu.Gifu-tvOSTests";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = appletvos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = 3;
TVOS_DEPLOYMENT_TARGET = 11.2;
};
name = Release;
};
/* End XCBuildConfiguration section */ /* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */ /* Begin XCConfigurationList section */
@ -539,6 +829,24 @@
defaultConfigurationIsVisible = 0; defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release; defaultConfigurationName = Release;
}; };
71E8B2EE20387D830037BA62 /* Build configuration list for PBXNativeTarget "Gifu_tvOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
71E8B2EF20387D830037BA62 /* Debug */,
71E8B2F020387D830037BA62 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
71E8B2F120387D830037BA62 /* Build configuration list for PBXNativeTarget "Gifu_tvOSTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
71E8B2F220387D830037BA62 /* Debug */,
71E8B2F320387D830037BA62 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */ /* End XCConfigurationList section */
}; };
rootObject = 00B8C7351A364DA400C188E7 /* Project object */; rootObject = 00B8C7351A364DA400C188E7 /* Project object */;

26
Gifu_tvOS-Info.plist Normal file
View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>3.0.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>142</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

19
Gifu_tvOS/Gifu_tvOS.h Normal file
View File

@ -0,0 +1,19 @@
//
// Gifu_tvOS.h
// Gifu_tvOS
//
// Created by Gruppioni Michele on 17/02/18.
// Copyright © 2018 Kaishin & Co. All rights reserved.
//
#import <UIKit/UIKit.h>
//! Project version number for Gifu_tvOS.
FOUNDATION_EXPORT double Gifu_tvOSVersionNumber;
//! Project version string for Gifu_tvOS.
FOUNDATION_EXPORT const unsigned char Gifu_tvOSVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <Gifu_tvOS/PublicHeader.h>

24
Gifu_tvOS/Info.plist Normal file
View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@ -0,0 +1,107 @@
//
// Gifu_tvOSTests.swift
// Gifu_tvOSTests
//
// Created by Gruppioni Michele on 17/02/18.
// Copyright © 2018 Kaishin & Co. All rights reserved.
//
import XCTest
import ImageIO
@testable import Gifu_tvOS
private let imageData = testImageDataNamed("mugen.gif")
private let staticImage = UIImage(data: imageData)!
private let preloadFrameCount = 20
class DummyAnimatable: GIFAnimatable {
init() {}
var animator: Animator? = nil
var image: UIImage? = nil
var layer = CALayer()
var frame: CGRect = .zero
var contentMode: UIViewContentMode = .scaleToFill
func animatorHasNewFrame() {}
}
class GifuTests: XCTestCase {
var animator: Animator!
var originalFrameCount: Int!
let delegate = DummyAnimatable()
override func setUp() {
super.setUp()
animator = Animator(withDelegate: delegate)
animator.prepareForAnimation(withGIFData: imageData, size: staticImage.size, contentMode: .scaleToFill)
originalFrameCount = 44
}
func testIsAnimatable() {
XCTAssertNotNil(animator.frameStore)
guard let store = animator.frameStore else { return }
XCTAssertTrue(store.isAnimatable)
}
func testCurrentFrame() {
XCTAssertNotNil(animator.frameStore)
guard let store = animator.frameStore else { return }
XCTAssertEqual(store.currentFrameIndex, 0)
}
func testFramePreload() {
XCTAssertNotNil(animator.frameStore)
guard let store = animator.frameStore else { return }
let expectation = self.expectation(description: "frameDuration")
store.prepareFrames {
let animatedFrameCount = store.animatedFrames.count
XCTAssertEqual(animatedFrameCount, self.originalFrameCount)
XCTAssertNotNil(store.frame(at: preloadFrameCount - 1))
XCTAssertNil(store.frame(at: preloadFrameCount + 1)?.images)
XCTAssertEqual(store.currentFrameIndex, 0)
store.shouldChangeFrame(with: 1.0) { hasNewFrame in
XCTAssertTrue(hasNewFrame)
XCTAssertEqual(store.currentFrameIndex, 1)
expectation.fulfill()
}
}
waitForExpectations(timeout: 1.0) { error in
if let error = error {
print("Error: \(error.localizedDescription)")
}
}
}
func testFrameInfo() {
XCTAssertNotNil(animator.frameStore)
guard let store = animator.frameStore else { return }
let expectation = self.expectation(description: "testFrameInfoIsAccurate")
store.prepareFrames {
let frameDuration = store.frame(at: 5)?.duration ?? 0
XCTAssertTrue((frameDuration - 0.05) < 0.00001)
let imageSize = store.frame(at: 5)?.size ?? CGSize.zero
XCTAssertEqual(imageSize, staticImage.size)
expectation.fulfill()
}
waitForExpectations(timeout: 1.0) { error in
if let error = error {
print("Error: \(error.localizedDescription)")
}
}
}
}
private func testImageDataNamed(_ name: String) -> Data {
let testBundle = Bundle(for: GifuTests.self)
let imagePath = testBundle.bundleURL.appendingPathComponent(name)
return (try! Data(contentsOf: imagePath))
}

22
Gifu_tvOSTests/Info.plist Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

View File

@ -1,3 +1,4 @@
import UIKit
/// Represents a single frame in a GIF. /// Represents a single frame in a GIF.
struct AnimatedFrame { struct AnimatedFrame {

View File

@ -1,3 +1,5 @@
import UIKit
/// Responsible for parsing GIF data and decoding the individual frames. /// Responsible for parsing GIF data and decoding the individual frames.
public class Animator { public class Animator {

View File

@ -1,4 +1,5 @@
import ImageIO import ImageIO
import UIKit
/// Responsible for storing and updating the frames of a single GIF. /// Responsible for storing and updating the frames of a single GIF.
class FrameStore { class FrameStore {

View File

@ -1,4 +1,5 @@
import Foundation import Foundation
import UIKit
/// The protocol that view classes need to conform to to enable animated GIF support. /// The protocol that view classes need to conform to to enable animated GIF support.
public protocol GIFAnimatable: class { public protocol GIFAnimatable: class {

View File

@ -1,3 +1,4 @@
import UIKit
/// Example class that conforms to `GIFAnimatable`. Uses default values for the animator frame buffer count and resize behavior. You can either use it directly in your code or use it as a blueprint for your own subclass. /// Example class that conforms to `GIFAnimatable`. Uses default values for the animator frame buffer count and resize behavior. You can either use it directly in your code or use it as a blueprint for your own subclass.
public class GIFImageView: UIImageView, GIFAnimatable { public class GIFImageView: UIImageView, GIFAnimatable {

View File

@ -1,3 +1,5 @@
import Foundation
import UIKit
extension CGSize { extension CGSize {
/// Calculates the aspect ratio of the size. /// Calculates the aspect ratio of the size.
/// ///

View File

@ -1,3 +1,4 @@
import UIKit
/// A `UIImage` extension that makes it easier to resize the image and inspect its size. /// A `UIImage` extension that makes it easier to resize the image and inspect its size.
extension UIImage { extension UIImage {
/// Resizes an image instance. /// Resizes an image instance.

View File

@ -1,2 +1,3 @@
/// Makes `UIImageView` conform to `ImageContainer` /// Makes `UIImageView` conform to `ImageContainer`
import UIKit
extension UIImageView: ImageContainer {} extension UIImageView: ImageContainer {}

View File

@ -19,7 +19,7 @@
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>141</string> <string>142</string>
<key>NSPrincipalClass</key> <key>NSPrincipalClass</key>
<string></string> <string></string>
</dict> </dict>