Set up example collection view

This commit is contained in:
Simon 2018-12-26 16:29:18 +08:00
parent 123f6c7443
commit 57dcb6038d
10 changed files with 171 additions and 77 deletions

View File

@ -9,11 +9,10 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
F4EC51C421D33B6900DED569 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4EC51C321D33B6900DED569 /* AppDelegate.swift */; }; F4EC51C421D33B6900DED569 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4EC51C321D33B6900DED569 /* AppDelegate.swift */; };
F4EC51C621D33B6900DED569 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4EC51C521D33B6900DED569 /* ViewController.swift */; }; F4EC51C621D33B6900DED569 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4EC51C521D33B6900DED569 /* ViewController.swift */; };
F4EC51C921D33B6900DED569 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F4EC51C721D33B6900DED569 /* Main.storyboard */; };
F4EC51CB21D33B6B00DED569 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F4EC51CA21D33B6B00DED569 /* Assets.xcassets */; }; F4EC51CB21D33B6B00DED569 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F4EC51CA21D33B6B00DED569 /* Assets.xcassets */; };
F4EC51CE21D33B6B00DED569 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F4EC51CC21D33B6B00DED569 /* LaunchScreen.storyboard */; }; F4EC51CE21D33B6B00DED569 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F4EC51CC21D33B6B00DED569 /* LaunchScreen.storyboard */; };
F4EC51D921D33B6B00DED569 /* ImagesExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4EC51D821D33B6B00DED569 /* ImagesExampleTests.swift */; }; F4EC51D921D33B6B00DED569 /* ImagesExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4EC51D821D33B6B00DED569 /* ImagesExampleTests.swift */; };
F4EC51F021D33C1800DED569 /* PlaceholderKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F4EC51E921D33B7D00DED569 /* PlaceholderKit.framework */; }; F4EC51F721D36DE100DED569 /* PlaceholderKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F4EC51E921D33B7D00DED569 /* PlaceholderKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
@ -38,13 +37,33 @@
remoteGlobalIDString = F444B67921C104460042E6F2; remoteGlobalIDString = F444B67921C104460042E6F2;
remoteInfo = PlaceholderKitTests; remoteInfo = PlaceholderKitTests;
}; };
F4EC51F821D36DE100DED569 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = F4EC51E321D33B7D00DED569 /* PlaceholderKit.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = F444B66F21C104460042E6F2;
remoteInfo = PlaceholderKit;
};
/* End PBXContainerItemProxy section */ /* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
F4EC51FA21D36DE200DED569 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
F4EC51F721D36DE100DED569 /* PlaceholderKit.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
F4EC51C021D33B6900DED569 /* ImagesExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ImagesExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; F4EC51C021D33B6900DED569 /* ImagesExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ImagesExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
F4EC51C321D33B6900DED569 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; F4EC51C321D33B6900DED569 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
F4EC51C521D33B6900DED569 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; }; F4EC51C521D33B6900DED569 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
F4EC51C821D33B6900DED569 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
F4EC51CA21D33B6B00DED569 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; F4EC51CA21D33B6B00DED569 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
F4EC51CD21D33B6B00DED569 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; F4EC51CD21D33B6B00DED569 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
F4EC51CF21D33B6B00DED569 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; F4EC51CF21D33B6B00DED569 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@ -59,7 +78,6 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
F4EC51F021D33C1800DED569 /* PlaceholderKit.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -98,7 +116,6 @@
children = ( children = (
F4EC51C321D33B6900DED569 /* AppDelegate.swift */, F4EC51C321D33B6900DED569 /* AppDelegate.swift */,
F4EC51C521D33B6900DED569 /* ViewController.swift */, F4EC51C521D33B6900DED569 /* ViewController.swift */,
F4EC51C721D33B6900DED569 /* Main.storyboard */,
F4EC51CA21D33B6B00DED569 /* Assets.xcassets */, F4EC51CA21D33B6B00DED569 /* Assets.xcassets */,
F4EC51CC21D33B6B00DED569 /* LaunchScreen.storyboard */, F4EC51CC21D33B6B00DED569 /* LaunchScreen.storyboard */,
F4EC51CF21D33B6B00DED569 /* Info.plist */, F4EC51CF21D33B6B00DED569 /* Info.plist */,
@ -141,10 +158,12 @@
F4EC51BC21D33B6900DED569 /* Sources */, F4EC51BC21D33B6900DED569 /* Sources */,
F4EC51BD21D33B6900DED569 /* Frameworks */, F4EC51BD21D33B6900DED569 /* Frameworks */,
F4EC51BE21D33B6900DED569 /* Resources */, F4EC51BE21D33B6900DED569 /* Resources */,
F4EC51FA21D36DE200DED569 /* Embed Frameworks */,
); );
buildRules = ( buildRules = (
); );
dependencies = ( dependencies = (
F4EC51F921D36DE100DED569 /* PBXTargetDependency */,
); );
name = ImagesExample; name = ImagesExample;
productName = ImagesExample; productName = ImagesExample;
@ -237,7 +256,6 @@
files = ( files = (
F4EC51CE21D33B6B00DED569 /* LaunchScreen.storyboard in Resources */, F4EC51CE21D33B6B00DED569 /* LaunchScreen.storyboard in Resources */,
F4EC51CB21D33B6B00DED569 /* Assets.xcassets in Resources */, F4EC51CB21D33B6B00DED569 /* Assets.xcassets in Resources */,
F4EC51C921D33B6900DED569 /* Main.storyboard in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -276,17 +294,14 @@
target = F4EC51BF21D33B6900DED569 /* ImagesExample */; target = F4EC51BF21D33B6900DED569 /* ImagesExample */;
targetProxy = F4EC51D521D33B6B00DED569 /* PBXContainerItemProxy */; targetProxy = F4EC51D521D33B6B00DED569 /* PBXContainerItemProxy */;
}; };
F4EC51F921D36DE100DED569 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = PlaceholderKit;
targetProxy = F4EC51F821D36DE100DED569 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */ /* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */ /* Begin PBXVariantGroup section */
F4EC51C721D33B6900DED569 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
F4EC51C821D33B6900DED569 /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
F4EC51CC21D33B6B00DED569 /* LaunchScreen.storyboard */ = { F4EC51CC21D33B6B00DED569 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup; isa = PBXVariantGroup;
children = ( children = (
@ -417,6 +432,7 @@
F4EC51DE21D33B6B00DED569 /* Debug */ = { F4EC51DE21D33B6B00DED569 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = T3LQ95726F; DEVELOPMENT_TEAM = T3LQ95726F;
@ -435,6 +451,7 @@
F4EC51DF21D33B6B00DED569 /* Release */ = { F4EC51DF21D33B6B00DED569 /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = T3LQ95726F; DEVELOPMENT_TEAM = T3LQ95726F;

View File

@ -16,6 +16,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch. // Override point for customization after application launch.
window = UIWindow(frame: UIScreen.main.bounds)
let controller = ViewController()
window?.rootViewController = controller
window?.makeKeyAndVisible()
return true return true
} }

View File

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<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="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>

View File

@ -22,8 +22,6 @@
<true/> <true/>
<key>UILaunchStoryboardName</key> <key>UILaunchStoryboardName</key>
<string>LaunchScreen</string> <string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key> <key>UIRequiredDeviceCapabilities</key>
<array> <array>
<string>armv7</string> <string>armv7</string>

View File

@ -10,16 +10,105 @@ import UIKit
import PlaceholderKit import PlaceholderKit
class ViewController: UIViewController { class ViewController: UIViewController {
var sampleImagesCollectionViewController: SampleImagesCollectionViewController?
lazy var images: [UIImage] = {
return [
PlaceholderBuilder().coloredBackground(color: .red, size: CGSize(width: 100, height: 100)),
PlaceholderBuilder().coloredBackground(color: .blue, size: CGSize(width: 100, height: 100)),
PlaceholderBuilder().coloredBackground(color: .green, size: CGSize(width: 100, height: 100)),
PlaceholderBuilder().coloredBackground(color: .yellow, size: CGSize(width: 100, height: 100)),
].compactMap({$0})
}()
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
let settings = PlaceholderSettings(size: CGSize(width: 320, height: 640), view.backgroundColor = UIColor(red: 0.3, green: 0.3, blue: 0.3, alpha: 1.0)
background: .solidColor(UIColor.red), setupCollectionViewController()
showDimensionAsText: true, }
convertDimensionToAspectRatio: false)
let factory = PlaceholderFactory(settings: settings) func setupCollectionViewController() {
let image = factory.createPlaceholder() let controller = SampleImagesCollectionViewController(data: images)
print(image) guard let collectionView = controller.view else { return }
collectionView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(collectionView)
sampleImagesCollectionViewController = controller
NSLayoutConstraint.activate([
collectionView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 30),
collectionView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -30),
collectionView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -30),
collectionView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 30)
])
}
}
class SampleImagesCollectionViewController: UICollectionViewController {
let data: [UIImage]
init(data: [UIImage]) {
self.data = data
let layout = UICollectionViewFlowLayout()
layout.itemSize = CGSize(width: 200, height: 200)
layout.scrollDirection = .vertical
super.init(collectionViewLayout: layout)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
collectionView.register(SampleImageCollectionViewCell.self, forCellWithReuseIdentifier: SampleImageCollectionViewCell.reuseIdentifier)
collectionView.backgroundColor = .clear
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return data.count
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: SampleImageCollectionViewCell.reuseIdentifier,
for: indexPath)
guard let castedCell = cell as? SampleImageCollectionViewCell else {
return cell
}
castedCell.imageView.image = data[indexPath.row]
return castedCell
}
}
class SampleImageCollectionViewCell: UICollectionViewCell {
static let reuseIdentifier = "SampleImagesCell"
lazy var imageView: UIImageView = {
let imageView = UIImageView()
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.contentMode = .scaleAspectFit
return imageView
}()
override init(frame: CGRect) {
super.init(frame: frame)
translatesAutoresizingMaskIntoConstraints = false
addSubview(imageView)
NSLayoutConstraint.activate([
imageView.topAnchor.constraint(equalTo: topAnchor),
imageView.bottomAnchor.constraint(equalTo: bottomAnchor),
imageView.leadingAnchor.constraint(equalTo: leadingAnchor),
imageView.trailingAnchor.constraint(equalTo: trailingAnchor)
])
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
} }
} }

View File

@ -384,8 +384,8 @@
baseConfigurationReference = F444B68D21C104900042E6F2 /* Universal-Framework-Target.xcconfig */; baseConfigurationReference = F444B68D21C104900042E6F2 /* Universal-Framework-Target.xcconfig */;
buildSettings = { buildSettings = {
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "Mac Developer";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = T3LQ95726F; DEVELOPMENT_TEAM = T3LQ95726F;
@ -395,6 +395,7 @@
FRAMEWORK_VERSION = A; FRAMEWORK_VERSION = A;
INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Framework-Info.plist"; INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Framework-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
@ -402,6 +403,7 @@
); );
PRODUCT_BUNDLE_IDENTIFIER = com.shaopinglee.PlaceholderKit; PRODUCT_BUNDLE_IDENTIFIER = com.shaopinglee.PlaceholderKit;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = ""; SDKROOT = "";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@ -414,8 +416,8 @@
baseConfigurationReference = F444B68D21C104900042E6F2 /* Universal-Framework-Target.xcconfig */; baseConfigurationReference = F444B68D21C104900042E6F2 /* Universal-Framework-Target.xcconfig */;
buildSettings = { buildSettings = {
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "Mac Developer";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = T3LQ95726F; DEVELOPMENT_TEAM = T3LQ95726F;
@ -425,6 +427,7 @@
FRAMEWORK_VERSION = A; FRAMEWORK_VERSION = A;
INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Framework-Info.plist"; INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Framework-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
@ -432,6 +435,7 @@
); );
PRODUCT_BUNDLE_IDENTIFIER = com.shaopinglee.PlaceholderKit; PRODUCT_BUNDLE_IDENTIFIER = com.shaopinglee.PlaceholderKit;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = ""; SDKROOT = "";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
SWIFT_VERSION = 4.2; SWIFT_VERSION = 4.2;
@ -444,8 +448,8 @@
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "Mac Developer";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_TEAM = T3LQ95726F; DEVELOPMENT_TEAM = T3LQ95726F;
INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/FrameworkTests-Info.plist"; INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/FrameworkTests-Info.plist";
@ -456,6 +460,7 @@
); );
PRODUCT_BUNDLE_IDENTIFIER = com.shaopinglee.PlaceholderKitTests; PRODUCT_BUNDLE_IDENTIFIER = com.shaopinglee.PlaceholderKitTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 4.2; SWIFT_VERSION = 4.2;
}; };
@ -467,8 +472,8 @@
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "-"; CODE_SIGN_IDENTITY = "Mac Developer";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
DEVELOPMENT_TEAM = T3LQ95726F; DEVELOPMENT_TEAM = T3LQ95726F;
INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/FrameworkTests-Info.plist"; INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/FrameworkTests-Info.plist";
@ -479,6 +484,7 @@
); );
PRODUCT_BUNDLE_IDENTIFIER = com.shaopinglee.PlaceholderKitTests; PRODUCT_BUNDLE_IDENTIFIER = com.shaopinglee.PlaceholderKitTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 4.2; SWIFT_VERSION = 4.2;
}; };
name = Release; name = Release;

View File

@ -10,7 +10,7 @@
import AppKit import AppKit
extension NSImage { extension NSImage {
static func createPlaceholder(withColor color: NSColor, size: CGSize) -> NSImage? { static func image(withColor color: NSColor, size: CGSize) -> NSImage? {
let image = NSImage(size: size) let image = NSImage(size: size)
image.lockFocus() image.lockFocus()
color.drawSwatch(in: NSMakeRect(0, 0, size.width, size.height)) color.drawSwatch(in: NSMakeRect(0, 0, size.width, size.height))

View File

@ -16,21 +16,26 @@ public typealias Color = UIColor
public typealias Image = UIImage public typealias Image = UIImage
#endif #endif
public struct PlaceholderFactory { public struct Placeholder {
let settings: PlaceholderSettings let size: CGSize
let backgroundStyle: BackgroundStyle
public func createPlaceholder() -> Image? { public init(size: CGSize, backgroundStyle: BackgroundStyle) {
switch settings.background { self.size = size
case .solidColor(let color): self.backgroundStyle = backgroundStyle
return Image.createPlaceholder(withColor: color, size: settings.size) }
case .image: }
return nil
} public struct PlaceholderBuilder {
public func coloredBackground(color: UIColor, size: CGSize) -> Image? {
return Image.image(withColor: color, size: size)
} }
public init(settings: PlaceholderSettings) { public func imageBackground(image: UIImage, size: CGSize, tiled: Bool = false) -> Image? {
self.settings = settings return nil
} }
public init() {}
} }
public struct PlaceholderSettings { public struct PlaceholderSettings {

View File

@ -10,16 +10,14 @@
import UIKit import UIKit
extension UIImage { extension UIImage {
static func createPlaceholder(withColor color: UIColor, size: CGSize) -> UIImage? { static func image(withColor color: UIColor, size: CGSize) -> UIImage? {
let rect = CGRect(origin: .zero, size: size) let renderer = UIGraphicsImageRenderer(size: size)
UIGraphicsBeginImageContextWithOptions(rect.size, false, 1.0) let image = renderer.image { context in
color.setFill() color.setFill()
UIRectFill(rect) context.fill(CGRect(origin: .zero, size: size))
let image = UIGraphicsGetImageFromCurrentImageContext() }
UIGraphicsEndImageContext()
guard let cgImage = image?.cgImage else { return nil } return image
return UIImage(cgImage: cgImage)
} }
} }

View File

@ -1,2 +1,2 @@
IPHONEOS_DEPLOYMENT_TARGET = 8.0 IPHONEOS_DEPLOYMENT_TARGET = 10.0
MACOSX_DEPLOYMENT_TARGET = 10.11 MACOSX_DEPLOYMENT_TARGET = 10.11