diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index a65d097fd..325ec37a8 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -415,6 +415,7 @@ 45FBC5C81DF8575700E9B410 /* CallKitCallManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45FBC59A1DF8575700E9B410 /* CallKitCallManager.swift */; }; 45FBC5D11DF8592E00E9B410 /* SignalCall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45FBC5D01DF8592E00E9B410 /* SignalCall.swift */; }; 4AC4EA13C8A444455DAB351F /* Pods_SignalMessaging.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 264242150E87D10A357DB07B /* Pods_SignalMessaging.framework */; }; + 4C11AA5020FD59C700351FBD /* MessageStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C11AA4F20FD59C700351FBD /* MessageStatusView.swift */; }; 4C13C9F620E57BA30089A98B /* ColorPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C13C9F520E57BA30089A98B /* ColorPickerViewController.swift */; }; 4C20B2B720CA0034001BAC90 /* ThreadViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4542DF51208B82E9007B4E76 /* ThreadViewModel.swift */; }; 4C20B2B920CA10DE001BAC90 /* ConversationSearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C20B2B820CA10DE001BAC90 /* ConversationSearchViewController.swift */; }; @@ -1081,6 +1082,7 @@ 45FBC59A1DF8575700E9B410 /* CallKitCallManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallKitCallManager.swift; sourceTree = ""; }; 45FBC5D01DF8592E00E9B410 /* SignalCall.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignalCall.swift; sourceTree = ""; }; 45FDA43420A4D22700396358 /* OWSNavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OWSNavigationBar.swift; sourceTree = ""; }; + 4C11AA4F20FD59C700351FBD /* MessageStatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageStatusView.swift; sourceTree = ""; }; 4C13C9F520E57BA30089A98B /* ColorPickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerViewController.swift; sourceTree = ""; }; 4C20B2B820CA10DE001BAC90 /* ConversationSearchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversationSearchViewController.swift; sourceTree = ""; }; 4C4AEC4420EC343B0020E72B /* DismissableTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DismissableTextField.swift; sourceTree = ""; }; @@ -1431,6 +1433,7 @@ 34386A4F207D0C01009F5D9C /* HomeViewController.h */, 34386A4D207D0C01009F5D9C /* HomeViewController.m */, 4C20B2B820CA10DE001BAC90 /* ConversationSearchViewController.swift */, + 4C11AA4F20FD59C700351FBD /* MessageStatusView.swift */, ); path = HomeView; sourceTree = ""; @@ -3365,6 +3368,7 @@ 34D2CCDF206939B400CB1A14 /* DebugUIMessagesAction.m in Sources */, 340FC8AC204DAC8D007AEB0F /* PrivacySettingsTableViewController.m in Sources */, 340FC8C5204DE223007AEB0F /* DebugUIBackup.m in Sources */, + 4C11AA5020FD59C700351FBD /* MessageStatusView.swift in Sources */, 340FC8AE204DAC8D007AEB0F /* OWSSoundSettingsViewController.m in Sources */, 4579431E1E7C8CE9008ED0C0 /* Pastelog.m in Sources */, 340FC8B0204DAC8D007AEB0F /* AddToBlockListViewController.m in Sources */, diff --git a/Signal/src/ViewControllers/HomeView/HomeViewCell.m b/Signal/src/ViewControllers/HomeView/HomeViewCell.m index 5dc1246e8..68d6eac7b 100644 --- a/Signal/src/ViewControllers/HomeView/HomeViewCell.m +++ b/Signal/src/ViewControllers/HomeView/HomeViewCell.m @@ -22,7 +22,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic) UILabel *nameLabel; @property (nonatomic) UILabel *snippetLabel; @property (nonatomic) UILabel *dateTimeLabel; -@property (nonatomic) UIImageView *messageStatusView; +@property (nonatomic) MessageStatusView *messageStatusView; @property (nonatomic) UIView *unreadBadge; @property (nonatomic) UILabel *unreadLabel; @@ -93,7 +93,7 @@ NS_ASSUME_NONNULL_BEGIN [self.dateTimeLabel setContentHuggingHorizontalHigh]; [self.dateTimeLabel setCompressionResistanceHorizontalHigh]; - self.messageStatusView = [UIImageView new]; + self.messageStatusView = [MessageStatusView new]; [self.messageStatusView setContentHuggingHorizontalHigh]; [self.messageStatusView setCompressionResistanceHorizontalHigh]; diff --git a/Signal/src/ViewControllers/HomeView/MessageStatusView.swift b/Signal/src/ViewControllers/HomeView/MessageStatusView.swift new file mode 100644 index 000000000..89a951e1a --- /dev/null +++ b/Signal/src/ViewControllers/HomeView/MessageStatusView.swift @@ -0,0 +1,52 @@ +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// + +import Foundation + +@objc +public class MessageStatusView: UIView { + + private let imageView: UIImageView + private let lastBaselineView: UIView + + // MessageStatusView is aligned 1pt below it's baseline. + private let kBaselineOverhang: CGFloat = 1 + + @objc + public var image: UIImage? { + get { + return imageView.image + } + set { + imageView.image = newValue + } + } + + public override init(frame: CGRect) { + self.imageView = UIImageView() + self.lastBaselineView = UIView() + + super.init(frame: frame) + + self.addSubview(imageView) + self.addSubview(lastBaselineView) + + imageView.setCompressionResistanceHigh() + imageView.setContentHuggingHigh() + imageView.autoPinEdgesToSuperviewEdges() + + lastBaselineView.autoSetDimension(.height, toSize: 1) + lastBaselineView.autoPinEdge(toSuperviewEdge: .left) + lastBaselineView.autoPinEdge(toSuperviewEdge: .right) + lastBaselineView.autoPinEdge(toSuperviewEdge: .bottom, withInset: kBaselineOverhang) + } + + public override var forLastBaselineLayout: UIView { + return self.lastBaselineView + } + + required public init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +}