From 47abbadabaa3a97cabc0bca3dfb7f2a65e89dde2 Mon Sep 17 00:00:00 2001 From: CMK Date: Mon, 1 Mar 2021 17:38:45 +0800 Subject: [PATCH] feat: draw welcome illustration --- Mastodon/Generated/Assets.swift | 13 ++ .../cloud.first.imageset/Contents.json | 2 +- .../Untitled-1_0008_Group-3.png | Bin 6655 -> 0 bytes .../Untitled-1_0010_Group-5.png | Bin .../cloud.second.imageset/Contents.json | 2 +- .../Untitled-1_0009_Group-4.png | Bin 0 -> 6802 bytes .../View/WelcomeIllustrationView.swift | 111 +++++++++++++++++- .../Welcome/WelcomeViewController.swift | 38 +++++- .../Container/MosaicImageViewContainer.swift | 26 ++-- .../Scene/Share/View/Content/StatusView.swift | 4 +- 10 files changed, 173 insertions(+), 23 deletions(-) delete mode 100644 Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.first.imageset/Untitled-1_0008_Group-3.png rename Mastodon/Resources/Assets.xcassets/Welcome/illustration/{cloud.second.imageset => cloud.first.imageset}/Untitled-1_0010_Group-5.png (100%) create mode 100644 Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.second.imageset/Untitled-1_0009_Group-4.png diff --git a/Mastodon/Generated/Assets.swift b/Mastodon/Generated/Assets.swift index 08507ed9d..46780bb6a 100644 --- a/Mastodon/Generated/Assets.swift +++ b/Mastodon/Generated/Assets.swift @@ -69,6 +69,19 @@ internal enum Asset { internal static let systemOrange = ColorAsset(name: "Colors/system.orange") } internal enum Welcome { + internal enum Illustration { + internal static let backgroundCyan = ColorAsset(name: "Welcome/illustration/background.cyan") + internal static let cloudBase = ImageAsset(name: "Welcome/illustration/cloud.base") + internal static let cloudFirst = ImageAsset(name: "Welcome/illustration/cloud.first") + internal static let cloudSecond = ImageAsset(name: "Welcome/illustration/cloud.second") + internal static let cloudThird = ImageAsset(name: "Welcome/illustration/cloud.third") + internal static let elephantFourOnGrassWithTreeTwo = ImageAsset(name: "Welcome/illustration/elephant.four.on.grass.with.tree.two") + internal static let elephantOnAirplaneWithContrail = ImageAsset(name: "Welcome/illustration/elephant.on.airplane.with.contrail") + internal static let elephantThreeOnGrass = ImageAsset(name: "Welcome/illustration/elephant.three.on.grass") + internal static let elephantThreeOnGrassWithTreeFour = ImageAsset(name: "Welcome/illustration/elephant.three.on.grass.with.tree.four") + internal static let elephantTwo = ImageAsset(name: "Welcome/illustration/elephant.two") + internal static let lineDashTwo = ImageAsset(name: "Welcome/illustration/line.dash.two") + } internal static let mastodonLogo = ImageAsset(name: "Welcome/mastodon.logo") internal static let mastodonLogoLarge = ImageAsset(name: "Welcome/mastodon.logo.large") } diff --git a/Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.first.imageset/Contents.json b/Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.first.imageset/Contents.json index b84ec128e..f8243850d 100644 --- a/Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.first.imageset/Contents.json +++ b/Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.first.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "Untitled-1_0008_Group-3.png", + "filename" : "Untitled-1_0010_Group-5.png", "idiom" : "universal", "scale" : "1x" }, diff --git a/Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.first.imageset/Untitled-1_0008_Group-3.png b/Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.first.imageset/Untitled-1_0008_Group-3.png deleted file mode 100644 index 1a982e42e405ef307e8f32d5915fb2e2a8a525fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6655 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 R`S%X3rKYc1uk85f{{T}+PS5}V diff --git a/Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.second.imageset/Untitled-1_0010_Group-5.png b/Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.first.imageset/Untitled-1_0010_Group-5.png similarity index 100% rename from Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.second.imageset/Untitled-1_0010_Group-5.png rename to Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.first.imageset/Untitled-1_0010_Group-5.png diff --git a/Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.second.imageset/Contents.json b/Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.second.imageset/Contents.json index f8243850d..005f195fa 100644 --- a/Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.second.imageset/Contents.json +++ b/Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.second.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "Untitled-1_0010_Group-5.png", + "filename" : "Untitled-1_0009_Group-4.png", "idiom" : "universal", "scale" : "1x" }, diff --git a/Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.second.imageset/Untitled-1_0009_Group-4.png b/Mastodon/Resources/Assets.xcassets/Welcome/illustration/cloud.second.imageset/Untitled-1_0009_Group-4.png new file mode 100644 index 0000000000000000000000000000000000000000..efcdca6c25896433c49652f496b32e08ad1a5510 GIT binary patch literal 6802 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%0AAIp!i-&=q9phP5|;q!fq~) z7d`cF_$J?e$C0(lO$<&qG)0u%-dx?C->Ggh*X8ZQvF7;#dA;Fa>4hgz1^4J+jkSG~ zcE^ohSPxmFwhg{^xw_7*r9zg9_pt_<>$T2#v_-hCD_sg&GpXJn`fVQhxBQ8V@Qp0xyxLY(po$?0YD@e0RqwN-I`inatWFIc z92-qi7846#P4?h>Zl{ss&LapO#zls?cUSqHH5%oG&qS#mXSSxb2KX?5GYvn$&)!;VJetA14qZLsm)1ntl3K-I zyO}??#T5`9u-{U(9@=#l<2*xFmssIojz>RS)tavff8Mv4{NkE)tL-rg#piS&p~rJ$ zKF{fvM>$}|+HvPbU6bIe5JrQeK$;~Xne+^{W8Gd?3Ep&BC+bPx$Y+KI3&jqzu<&P8 z59eZpd(}0i;5`cOPaeM*ZsdW~JbD(%cy~ypnSQ@(U}}FoxY@MGnzTrxH+eX~w8NgM z8my5eQxhH?t4N{x1$;u?pAN9qCN>(6U}@iS8CZa8h}wVaxbp9(G*a8gM=@{T<{U`c zE@ z&OnVf(nCiemR-cxaP=O({+1CEQS{2J!V&*Ib@(13L}WGEI`bZJ9m(hZ!JH_KRDQ?p z+T}fq3O5zZ1SjIzpf65pDoUIh$+t-5T87*gV1IkYOV3!fU{p&ve}xs{q!$Zc<*AkkN}T?cpXSE$;c_!@se#~rUVn|8+(|B9r(f;2Hv zfhCs{1Xdr0YU2Bt=%_d%obBVjDw`}z#;0qRM?!BTOYq6p`I1Hv8c%M%Jcqzs`_@?C z)CCQEoxPewRb~~m*1n@0XU%VB^hU^f>RGEKvbeo0`}ed^CLucZ%@!Eg#}68fA6Py_ za>+eTCT=%}<+b8MC`LO0rUN++NH0$H?MOeu6DZ!B6Ac<8VYo_=QIXk%HrepE% ziB|$`@gXM5$2ceBQ73BA4%RbYsU({B=s8~ZAgV+1oPymQ;$Qvu0oL1DcZ;#D`CJ=f zp(+rvd`{@Fps8A$ZP>k&)#m=tC=tV!<5vRkZncj_wB ziNx~Ghi&4sMlHs>lU2?a<(a0=1+`n>XFqaMj1(5r;$el6%w9OcTeH z8YIS=PLxqrYSc~`DxS(Ad0ubwA+UbyGSl1PJCP_GW1ee>UC#K*bx5F<+G?={D(%;; zuvbFg>{9~UcBx!X;`qZ)c-rylyB8NT94PsxQ(hQfS`OP&+lSJa?pC2UnTz5JEjiQ#XI&m?JMBw~s(qAlF|`be^d>kN)`p2#N{a*RmU%35#IYJzSa<)^Z0q3%tCgHnF-J0uez*)E=lx5^! UIImage { + let size = artworkImageSize + let width = artworkImageSize.width + let height = artworkImageSize.height + let image = UIGraphicsImageRenderer(size: size).image { context in + // clear background + UIColor.clear.setFill() + context.fill(CGRect(origin: .zero, size: artworkImageSize)) + + // draw cloud + let cloudBaseImage = Asset.Welcome.Illustration.cloudBase.image + cloudBaseImage.draw(at: CGPoint(x: 0, y: height - cloudBaseImage.size.height)) + + let elephantFourOnGrassWithTreeTwoImage = Asset.Welcome.Illustration.elephantFourOnGrassWithTreeTwo.image + let elephantThreeOnGrassWithTreeFourImage = Asset.Welcome.Illustration.elephantThreeOnGrassWithTreeFour.image + let elephantThreeOnGrassImage = Asset.Welcome.Illustration.elephantThreeOnGrass.image + let elephantTwoImage = Asset.Welcome.Illustration.elephantTwo.image + let ineDashTwoImage = Asset.Welcome.Illustration.lineDashTwo.image + + let elephantOnAirplaneWithContrailImageView = Asset.Welcome.Illustration.elephantOnAirplaneWithContrail.image + + // draw elephantFourOnGrassWithTreeTwo + // elephantFourOnGrassWithTreeTwo.bottomY + 40 align to elephantThreeOnGrassImage.centerY + elephantFourOnGrassWithTreeTwoImage.draw(at: CGPoint(x: 0, y: height - 0.5 * elephantThreeOnGrassImage.size.height - elephantFourOnGrassWithTreeTwoImage.size.height - 40)) + + // draw elephantThreeOnGrassWithTreeFour + // elephantThreeOnGrassWithTreeFour.bottomY + 40 align to elephantThreeOnGrassImage.centerY + elephantThreeOnGrassWithTreeFourImage.draw(at: CGPoint(x: width - elephantThreeOnGrassWithTreeFourImage.size.width, y: height - 0.5 * elephantThreeOnGrassImage.size.height - elephantThreeOnGrassWithTreeFourImage.size.height - 40)) + + // draw elephantThreeOnGrass + elephantThreeOnGrassImage.draw(at: CGPoint(x: 0, y: height - elephantThreeOnGrassImage.size.height)) + + // darw ineDashTwoImage + ineDashTwoImage.draw(at: CGPoint(x: 0.5 * elephantThreeOnGrassImage.size.width + 60, y: height - elephantThreeOnGrassImage.size.height - 50)) + + // draw elephantTwo.image + elephantTwoImage.draw(at: CGPoint(x: 0, y: height - elephantTwoImage.size.height - 125)) + + // draw elephantOnAirplaneWithContrailImageView + elephantOnAirplaneWithContrailImageView.draw(at: CGPoint(x: 0, y: height - cloudBaseImage.size.height - 0.5 * elephantOnAirplaneWithContrailImageView.size.height)) + } + + return image } } @@ -33,10 +128,20 @@ import SwiftUI struct WelcomeIllustrationView_Previews: PreviewProvider { static var previews: some View { - UIViewPreview(width: 375) { - WelcomeIllustrationView() + Group { + UIViewPreview(width: 870) { + WelcomeIllustrationView() + } + .previewLayout(.fixed(width: 870, height: 2000)) + UIViewPreview(width: 375) { + WelcomeIllustrationView() + } + .previewLayout(.fixed(width: 375, height: 812)) + UIViewPreview(width: 428) { + WelcomeIllustrationView() + } + .previewLayout(.fixed(width: 428, height: 926)) } - .previewLayout(.fixed(width: 375, height: 812)) } } diff --git a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift index e832e5a43..dc6a0b0cd 100644 --- a/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift +++ b/Mastodon/Scene/Onboarding/Welcome/WelcomeViewController.swift @@ -13,6 +13,9 @@ final class WelcomeViewController: UIViewController, NeedsDependency { weak var context: AppContext! { willSet { precondition(!isViewLoaded) } } weak var coordinator: SceneCoordinator! { willSet { precondition(!isViewLoaded) } } + let welcomeIllustrationView = WelcomeIllustrationView() + var welcomeIllustrationViewBottomAnchorLayoutConstraint: NSLayoutConstraint! + private(set) lazy var logoImageView: UIImageView = { let image = view.traitCollection.userInterfaceIdiom == .phone ? Asset.Welcome.mastodonLogo.image : Asset.Welcome.mastodonLogoLarge.image let imageView = UIImageView(image: image) @@ -42,7 +45,7 @@ final class WelcomeViewController: UIViewController, NeedsDependency { let button = UIButton(type: .system) button.titleLabel?.font = UIFontMetrics(forTextStyle: .headline).scaledFont(for: .systemFont(ofSize: 15, weight: .semibold)) button.setTitle(L10n.Common.Controls.Actions.signIn, for: .normal) - button.setTitleColor(Asset.Colors.lightBrandBlue.color, for: .normal) + button.setTitleColor(UIColor.white.withAlphaComponent(0.8), for: .normal) button.setInsets(forContentPadding: UIEdgeInsets(top: 12, left: 0, bottom: 12, right: 0), imageTitlePadding: 0) button.translatesAutoresizingMaskIntoConstraints = false return button @@ -60,6 +63,16 @@ extension WelcomeViewController { super.viewDidLoad() setupOnboardingAppearance() + view.backgroundColor = Asset.Welcome.Illustration.backgroundCyan.color + + welcomeIllustrationView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(welcomeIllustrationView) + welcomeIllustrationViewBottomAnchorLayoutConstraint = welcomeIllustrationView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + NSLayoutConstraint.activate([ + welcomeIllustrationView.leftAnchor.constraint(equalTo: view.leftAnchor), + welcomeIllustrationView.rightAnchor.constraint(equalTo: view.rightAnchor), + welcomeIllustrationViewBottomAnchorLayoutConstraint, + ]) view.addSubview(logoImageView) NSLayoutConstraint.activate([ @@ -76,6 +89,19 @@ extension WelcomeViewController { sloganLabel.topAnchor.constraint(equalTo: logoImageView.bottomAnchor, constant: 168), ]) + welcomeIllustrationView.cloudFirstImageView.translatesAutoresizingMaskIntoConstraints = false + welcomeIllustrationView.cloudSecondImageView.translatesAutoresizingMaskIntoConstraints = false + welcomeIllustrationView.cloudFirstImageView.translatesAutoresizingMaskIntoConstraints = false + +// welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.translatesAutoresizingMaskIntoConstraints = false +// view.addSubview(welcomeIllustrationView.elephantOnAirplaneWithContrailImageView) +// NSLayoutConstraint.activate([ +// welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.leftAnchor.constraint(equalTo: view.leftAnchor), +// welcomeIllustrationView.elephantOnAirplaneWithContrailImageView.bottomAnchor.constraint(equalTo: sloganLabel.topAnchor), +// ]) +// welcomeIllustrationView.welcomeIllustrationView.sca +// view.bringSubviewToFront(sloganLabel) + view.addSubview(signInButton) view.addSubview(signUpButton) NSLayoutConstraint.activate([ @@ -94,8 +120,14 @@ extension WelcomeViewController { signInButton.addTarget(self, action: #selector(signInButtonDidClicked(_:)), for: .touchUpInside) } - override var preferredStatusBarStyle: UIStatusBarStyle { return .darkContent } - + override func viewSafeAreaInsetsDidChange() { + super.viewSafeAreaInsetsDidChange() + + // make illustration bottom over the bleeding + let overlap: CGFloat = 100 + welcomeIllustrationViewBottomAnchorLayoutConstraint.constant = overlap - view.safeAreaInsets.bottom + } + } extension WelcomeViewController { diff --git a/Mastodon/Scene/Share/View/Container/MosaicImageViewContainer.swift b/Mastodon/Scene/Share/View/Container/MosaicImageViewContainer.swift index 5240d4e2c..71984800b 100644 --- a/Mastodon/Scene/Share/View/Container/MosaicImageViewContainer.swift +++ b/Mastodon/Scene/Share/View/Container/MosaicImageViewContainer.swift @@ -287,11 +287,11 @@ struct MosaicImageView_Previews: PreviewProvider { UIViewPreview(width: 375) { let view = MosaicImageViewContainer() let image = images[3] - let imageView = view.setupImageView( + let artworkImageView = view.setupImageView( aspectRatio: image.size, maxSize: CGSize(width: 375, height: 400) ) - imageView.image = image + artworkImageView.image = image return view } .previewLayout(.fixed(width: 375, height: 400)) @@ -299,14 +299,14 @@ struct MosaicImageView_Previews: PreviewProvider { UIViewPreview(width: 375) { let view = MosaicImageViewContainer() let image = images[1] - let imageView = view.setupImageView( + let artworkImageView = view.setupImageView( aspectRatio: image.size, maxSize: CGSize(width: 375, height: 400) ) - imageView.layer.masksToBounds = true - imageView.layer.cornerRadius = 8 - imageView.contentMode = .scaleAspectFill - imageView.image = image + artworkImageView.layer.masksToBounds = true + artworkImageView.layer.cornerRadius = 8 + artworkImageView.contentMode = .scaleAspectFill + artworkImageView.image = image return view } .previewLayout(.fixed(width: 375, height: 400)) @@ -315,8 +315,8 @@ struct MosaicImageView_Previews: PreviewProvider { let view = MosaicImageViewContainer() let images = self.images.prefix(2) let imageViews = view.setupImageViews(count: images.count, maxHeight: 162) - for (i, imageView) in imageViews.enumerated() { - imageView.image = images[i] + for (i, artworkImageView) in imageViews.enumerated() { + artworkImageView.image = images[i] } return view } @@ -326,8 +326,8 @@ struct MosaicImageView_Previews: PreviewProvider { let view = MosaicImageViewContainer() let images = self.images.prefix(3) let imageViews = view.setupImageViews(count: images.count, maxHeight: 162) - for (i, imageView) in imageViews.enumerated() { - imageView.image = images[i] + for (i, artworkImageView) in imageViews.enumerated() { + artworkImageView.image = images[i] } return view } @@ -337,8 +337,8 @@ struct MosaicImageView_Previews: PreviewProvider { let view = MosaicImageViewContainer() let images = self.images.prefix(4) let imageViews = view.setupImageViews(count: images.count, maxHeight: 162) - for (i, imageView) in imageViews.enumerated() { - imageView.image = images[i] + for (i, artworkImageView) in imageViews.enumerated() { + artworkImageView.image = images[i] } return view } diff --git a/Mastodon/Scene/Share/View/Content/StatusView.swift b/Mastodon/Scene/Share/View/Content/StatusView.swift index be754ed86..46a416fd0 100644 --- a/Mastodon/Scene/Share/View/Content/StatusView.swift +++ b/Mastodon/Scene/Share/View/Content/StatusView.swift @@ -358,8 +358,8 @@ struct StatusView_Previews: PreviewProvider { statusView.updateContentWarningDisplay(isHidden: false) let images = MosaicImageView_Previews.images let imageViews = statusView.statusMosaicImageView.setupImageViews(count: 4, maxHeight: 162) - for (i, imageView) in imageViews.enumerated() { - imageView.image = images[i] + for (i, artworkImageView) in imageViews.enumerated() { + artworkImageView.image = images[i] } statusView.statusMosaicImageView.isHidden = false return statusView