From bb20e4d2a2af3e20d784cc6fdf6173c2394a8970 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Wed, 17 Apr 2019 10:15:44 -0500 Subject: [PATCH] Added disclosure indicators. --- iOS/AppAssets.swift | 18 ++++++++++++-- iOS/Master/Cell/MasterTableViewCell.swift | 23 ++++++++++++++++++ .../Cell/MasterTableViewCellLayout.swift | 12 ++++++++- .../Contents.json | 20 +++++++++++++++ .../chevronDownImage.imageset/Contents.json | 12 +++++++++ .../chevronDownImage.imageset/chevronDown.pdf | Bin 0 -> 3996 bytes .../chevronRightImage.imageset/Contents.json | 12 +++++++++ .../chevronRight.pdf | Bin 0 -> 3993 bytes .../Cell/MasterTimelineCellLayout.swift | 6 ++++- .../Cell/MasterTimelineTableViewCell.swift | 7 +++++- 10 files changed, 105 insertions(+), 5 deletions(-) create mode 100644 iOS/Resources/Assets.xcassets/chevronDisclosureColor.colorset/Contents.json create mode 100644 iOS/Resources/Assets.xcassets/chevronDownImage.imageset/Contents.json create mode 100644 iOS/Resources/Assets.xcassets/chevronDownImage.imageset/chevronDown.pdf create mode 100644 iOS/Resources/Assets.xcassets/chevronRightImage.imageset/Contents.json create mode 100644 iOS/Resources/Assets.xcassets/chevronRightImage.imageset/chevronRight.pdf diff --git a/iOS/AppAssets.swift b/iOS/AppAssets.swift index 514602341..459c97cd3 100644 --- a/iOS/AppAssets.swift +++ b/iOS/AppAssets.swift @@ -18,6 +18,20 @@ struct AppAssets { return RSImage(named: "circleOpenImage")! }() + static var chevronDisclosureColor: UIColor = { + return UIColor(named: "chevronDisclosureColor")! + }() + + static var chevronDownImage: RSImage = { + let image = RSImage(named: "chevronDownImage")! + return image.maskWithColor(color: AppAssets.chevronDisclosureColor)! + }() + + static var chevronRightImage: RSImage = { + let image = RSImage(named: "chevronRightImage")! + return image.maskWithColor(color: AppAssets.chevronDisclosureColor)! + }() + static var cogImage: RSImage = { return RSImage(named: "cogImage")! }() @@ -34,8 +48,8 @@ struct AppAssets { return UIColor(named: "masterFolderColor")! }() - static var masterFolderImage: UIImage = { - let image = UIImage(named: "folderImage")! + static var masterFolderImage: RSImage = { + let image = RSImage(named: "folderImage")! return image.maskWithColor(color: AppAssets.masterFolderColor)! }() diff --git a/iOS/Master/Cell/MasterTableViewCell.swift b/iOS/Master/Cell/MasterTableViewCell.swift index b2bc682eb..f83ae2d93 100644 --- a/iOS/Master/Cell/MasterTableViewCell.swift +++ b/iOS/Master/Cell/MasterTableViewCell.swift @@ -13,6 +13,8 @@ import RSTree class MasterTableViewCell : UITableViewCell { + private var accessoryButton: UIButton? + override var accessibilityLabel: String? { set {} get { @@ -102,15 +104,36 @@ class MasterTableViewCell : UITableViewCell { layoutWith(layout) } + @objc func buttonPressed(_ sender: UIButton) { + + if sender.imageView?.image == AppAssets.chevronRightImage { + sender.setImage(AppAssets.chevronDownImage, for: .normal) + } else { + sender.setImage(AppAssets.chevronRightImage, for: .normal) + } + + + } } private extension MasterTableViewCell { func commonInit() { + addAccessoryView() addSubviewAtInit(unreadCountView) addSubviewAtInit(faviconImageView) addSubviewAtInit(titleView) } + + func addAccessoryView() { + let button = UIButton(type: .roundedRect) + button.frame = CGRect(x: 0, y: 0, width: 15.0, height: 15.0) + button.setImage(AppAssets.chevronRightImage, for: .normal) + button.tintColor = AppAssets.chevronDisclosureColor + button.addTarget(self, action: #selector(buttonPressed(_:)), for: UIControl.Event.touchUpInside) + accessoryButton = button + accessoryView = button + } func addSubviewAtInit(_ view: UIView) { addSubview(view) diff --git a/iOS/Master/Cell/MasterTableViewCellLayout.swift b/iOS/Master/Cell/MasterTableViewCellLayout.swift index 908283847..b1e15aed8 100644 --- a/iOS/Master/Cell/MasterTableViewCellLayout.swift +++ b/iOS/Master/Cell/MasterTableViewCellLayout.swift @@ -17,13 +17,23 @@ struct MasterTableViewCellLayout { private static let unreadCountMarginLeft = CGFloat(integerLiteral: 8) private static let unreadCountMarginRight = CGFloat(integerLiteral: 8) + private static let chevronWidth = CGFloat(integerLiteral: 40) + let faviconRect: CGRect let titleRect: CGRect let unreadCountRect: CGRect init(cellSize: CGSize, shouldShowImage: Bool, label: UILabel, unreadCountView: MasterUnreadCountView, showingEditingControl: Bool) { - let bounds = CGRect(x: 0.0, y: 0.0, width: floor(cellSize.width), height: floor(cellSize.height)) + let adjustedWidth: CGFloat = { + if showingEditingControl { + return floor(cellSize.width) + } else { + return floor(cellSize.width) - MasterTableViewCellLayout.chevronWidth + } + }() + + let bounds = CGRect(x: 0.0, y: 0.0, width: adjustedWidth, height: floor(cellSize.height)) var rFavicon = CGRect.zero if shouldShowImage { diff --git a/iOS/Resources/Assets.xcassets/chevronDisclosureColor.colorset/Contents.json b/iOS/Resources/Assets.xcassets/chevronDisclosureColor.colorset/Contents.json new file mode 100644 index 000000000..faf582c66 --- /dev/null +++ b/iOS/Resources/Assets.xcassets/chevronDisclosureColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "200", + "alpha" : "1.000", + "blue" : "200", + "green" : "200" + } + } + } + ] +} \ No newline at end of file diff --git a/iOS/Resources/Assets.xcassets/chevronDownImage.imageset/Contents.json b/iOS/Resources/Assets.xcassets/chevronDownImage.imageset/Contents.json new file mode 100644 index 000000000..4e4464069 --- /dev/null +++ b/iOS/Resources/Assets.xcassets/chevronDownImage.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "chevronDown.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/iOS/Resources/Assets.xcassets/chevronDownImage.imageset/chevronDown.pdf b/iOS/Resources/Assets.xcassets/chevronDownImage.imageset/chevronDown.pdf new file mode 100644 index 0000000000000000000000000000000000000000..60ce49f7646348500c07566968209cc16a9e37d8 GIT binary patch literal 3996 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 literal 0 HcmV?d00001 diff --git a/iOS/Timeline/Cell/MasterTimelineCellLayout.swift b/iOS/Timeline/Cell/MasterTimelineCellLayout.swift index 280b824cc..8d0feabd2 100644 --- a/iOS/Timeline/Cell/MasterTimelineCellLayout.swift +++ b/iOS/Timeline/Cell/MasterTimelineCellLayout.swift @@ -39,6 +39,8 @@ struct MasterTimelineCellLayout { static let avatarMarginLeft = CGFloat(integerLiteral: 8) static let avatarCornerRadius = CGFloat(integerLiteral: 4) + static let chevronWidth = CGFloat(integerLiteral: 28) + let width: CGFloat let height: CGFloat let feedNameRect: CGRect @@ -54,7 +56,7 @@ struct MasterTimelineCellLayout { init(width: CGFloat, height: CGFloat, feedNameRect: CGRect, dateRect: CGRect, titleRect: CGRect, numberOfLinesForTitle: Int, summaryRect: CGRect, textRect: CGRect, unreadIndicatorRect: CGRect, starRect: CGRect, avatarImageRect: CGRect, paddingBottom: CGFloat) { - self.width = width + self.width = width - MasterTimelineCellLayout.chevronWidth self.feedNameRect = feedNameRect self.dateRect = dateRect self.titleRect = titleRect @@ -76,6 +78,8 @@ struct MasterTimelineCellLayout { init(width: CGFloat, height: CGFloat, cellData: MasterTimelineCellData, hasAvatar: Bool) { + let width = width - MasterTimelineCellLayout.chevronWidth + // If height == 0.0, then height is calculated. let showAvatar = hasAvatar && cellData.showAvatar diff --git a/iOS/Timeline/Cell/MasterTimelineTableViewCell.swift b/iOS/Timeline/Cell/MasterTimelineTableViewCell.swift index 44357c1a8..41cc9631f 100644 --- a/iOS/Timeline/Cell/MasterTimelineTableViewCell.swift +++ b/iOS/Timeline/Cell/MasterTimelineTableViewCell.swift @@ -107,6 +107,7 @@ private extension MasterTimelineTableViewCell { func commonInit() { + addAccessoryView() addSubviewAtInit(titleView, hidden: false) addSubviewAtInit(summaryView, hidden: true) addSubviewAtInit(textView, hidden: true) @@ -117,7 +118,11 @@ private extension MasterTimelineTableViewCell { addSubviewAtInit(starView, hidden: true) } - + + func addAccessoryView() { + accessoryView = UIImageView(image: AppAssets.chevronRightImage) + } + func updatedLayoutRects() -> MasterTimelineCellLayout { return MasterTimelineCellLayout(width: bounds.width, height: bounds.height, cellData: cellData, hasAvatar: avatarImageView.image != nil)