From 3464fbfc7f190b42cee3f5fdff2463881b1e9e2d Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Fri, 27 Sep 2019 05:42:16 -0500 Subject: [PATCH] Animate chevron rotation --- iOS/AppAssets.swift | 8 ++++---- .../Cell/MasterFeedTableViewCell.swift | 11 +++++++---- .../Cell/MasterFeedTableViewSectionHeader.swift | 13 ++++++++----- .../chevronBase.imageset/Contents.json | 15 +++++++++++++++ .../chevronBase.imageset/chevron-base.pdf | Bin 0 -> 4029 bytes .../chevronSmall.imageset/Contents.json | 15 +++++++++++++++ .../chevronSmall.imageset/chevron-small.pdf | Bin 0 -> 4031 bytes 7 files changed, 49 insertions(+), 13 deletions(-) create mode 100644 iOS/Resources/Assets.xcassets/chevronBase.imageset/Contents.json create mode 100644 iOS/Resources/Assets.xcassets/chevronBase.imageset/chevron-base.pdf create mode 100644 iOS/Resources/Assets.xcassets/chevronSmall.imageset/Contents.json create mode 100644 iOS/Resources/Assets.xcassets/chevronSmall.imageset/chevron-small.pdf diff --git a/iOS/AppAssets.swift b/iOS/AppAssets.swift index 72a740bb9..1ad368e43 100644 --- a/iOS/AppAssets.swift +++ b/iOS/AppAssets.swift @@ -48,12 +48,12 @@ struct AppAssets { return UIImage(systemName: "circle")! }() - static var chevronDownImage: UIImage = { - return UIImage(systemName: "chevron.down")! + static var chevronSmallImage: UIImage = { + return UIImage(named: "chevronSmall")! }() - static var chevronRightImage: UIImage = { - return UIImage(systemName: "chevron.right")! + static var chevronBaseImage: UIImage = { + return UIImage(named: "chevronBase")! }() static var copyImage: UIImage = { diff --git a/iOS/MasterFeed/Cell/MasterFeedTableViewCell.swift b/iOS/MasterFeed/Cell/MasterFeedTableViewCell.swift index 662f39903..6b82c7bd7 100644 --- a/iOS/MasterFeed/Cell/MasterFeedTableViewCell.swift +++ b/iOS/MasterFeed/Cell/MasterFeedTableViewCell.swift @@ -152,15 +152,18 @@ private extension MasterFeedTableViewCell { func addDisclosureView() { disclosureButton = NonIntrinsicButton(type: .roundedRect) disclosureButton!.addTarget(self, action: #selector(buttonPressed(_:)), for: UIControl.Event.touchUpInside) + disclosureButton?.setImage(AppAssets.chevronBaseImage, for: .normal) updateDisclosureImage() addSubviewAtInit(disclosureButton!) } func updateDisclosureImage() { - if disclosureExpanded { - disclosureButton?.setImage(AppAssets.chevronDownImage, for: .normal) - } else { - disclosureButton?.setImage(AppAssets.chevronRightImage, for: .normal) + UIView.animate(withDuration: 0.3) { + if self.disclosureExpanded { + self.disclosureButton?.imageView?.transform = CGAffineTransform(rotationAngle: 1.570796) + } else { + self.disclosureButton?.imageView?.transform = CGAffineTransform(rotationAngle: 0) + } } } diff --git a/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeader.swift b/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeader.swift index 78762da1c..901184ec6 100644 --- a/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeader.swift +++ b/iOS/MasterFeed/Cell/MasterFeedTableViewSectionHeader.swift @@ -66,6 +66,8 @@ class MasterFeedTableViewSectionHeader: UITableViewHeaderFooterView { private let unreadCountView = MasterFeedUnreadCountView(frame: CGRect.zero) private var disclosureView: UIImageView = { let iView = NonIntrinsicImageView() + iView.tintColor = UIColor.tertiaryLabel + iView.image = AppAssets.chevronSmallImage iView.contentMode = .center return iView }() @@ -131,11 +133,12 @@ private extension MasterFeedTableViewSectionHeader { } func updateDisclosureImage() { - disclosureView.tintColor = UIColor.tertiaryLabel - if disclosureExpanded { - disclosureView.image = AppAssets.chevronDownImage - } else { - disclosureView.image = AppAssets.chevronRightImage + UIView.animate(withDuration: 0.3) { + if self.disclosureExpanded { + self.disclosureView.transform = CGAffineTransform(rotationAngle: 1.570796) + } else { + self.disclosureView.transform = CGAffineTransform(rotationAngle: 0) + } } } diff --git a/iOS/Resources/Assets.xcassets/chevronBase.imageset/Contents.json b/iOS/Resources/Assets.xcassets/chevronBase.imageset/Contents.json new file mode 100644 index 000000000..19c2e918a --- /dev/null +++ b/iOS/Resources/Assets.xcassets/chevronBase.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "chevron-base.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/iOS/Resources/Assets.xcassets/chevronBase.imageset/chevron-base.pdf b/iOS/Resources/Assets.xcassets/chevronBase.imageset/chevron-base.pdf new file mode 100644 index 0000000000000000000000000000000000000000..610968af4f9ca33ecaf8bf9a668f742e84997e8e GIT binary patch literal 4029 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 NQea_W4P8y}{{Vlj=wbi> literal 0 HcmV?d00001 diff --git a/iOS/Resources/Assets.xcassets/chevronSmall.imageset/Contents.json b/iOS/Resources/Assets.xcassets/chevronSmall.imageset/Contents.json new file mode 100644 index 000000000..6ffaf1016 --- /dev/null +++ b/iOS/Resources/Assets.xcassets/chevronSmall.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "chevron-small.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/iOS/Resources/Assets.xcassets/chevronSmall.imageset/chevron-small.pdf b/iOS/Resources/Assets.xcassets/chevronSmall.imageset/chevron-small.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7f9873a86ea8c6f5ec2d4baa9b856e8672bdd3fb GIT binary patch literal 4031 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