@ -68,8 +68,6 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou
private let showAllMediaButton : Bool
private let showAllMediaButton : Bool
private let sliderEnabled : Bool
private let sliderEnabled : Bool
private let headerView : UIView
init ( initialItem : MediaGalleryItem , mediaGalleryDataSource : MediaGalleryDataSource , uiDatabaseConnection : YapDatabaseConnection , options : MediaGalleryOption ) {
init ( initialItem : MediaGalleryItem , mediaGalleryDataSource : MediaGalleryDataSource , uiDatabaseConnection : YapDatabaseConnection , options : MediaGalleryOption ) {
assert ( uiDatabaseConnection . isInLongLivedReadTransaction ( ) )
assert ( uiDatabaseConnection . isInLongLivedReadTransaction ( ) )
self . uiDatabaseConnection = uiDatabaseConnection
self . uiDatabaseConnection = uiDatabaseConnection
@ -79,30 +77,10 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou
let kSpacingBetweenItems : CGFloat = 20
let kSpacingBetweenItems : CGFloat = 20
self . headerView = UIView ( )
headerView . layoutMargins = UIEdgeInsets ( top : 2 , left : 8 , bottom : 4 , right : 8 )
super . init ( transitionStyle : . scroll ,
super . init ( transitionStyle : . scroll ,
navigationOrientation : . horizontal ,
navigationOrientation : . horizontal ,
options : [ UIPageViewControllerOptionInterPageSpacingKey : kSpacingBetweenItems ] )
options : [ UIPageViewControllerOptionInterPageSpacingKey : kSpacingBetweenItems ] )
let headerStackView = UIStackView ( )
headerView . addSubview ( headerStackView )
headerStackView . axis = . vertical
headerStackView . alignment = . center
headerStackView . spacing = 0
headerStackView . distribution = . fillProportionally
headerStackView . addArrangedSubview ( headerNameLabel )
headerStackView . addArrangedSubview ( headerDateLabel )
headerStackView . autoPinEdge ( toSuperviewMargin : . top , relation : . greaterThanOrEqual )
headerStackView . autoPinEdge ( toSuperviewMargin : . right , relation : . greaterThanOrEqual )
headerStackView . autoPinEdge ( toSuperviewMargin : . bottom , relation : . greaterThanOrEqual )
headerStackView . autoPinEdge ( toSuperviewMargin : . left , relation : . greaterThanOrEqual )
headerStackView . setContentHuggingHigh ( )
headerStackView . autoCenterInSuperview ( )
self . dataSource = self
self . dataSource = self
self . delegate = self
self . delegate = self
@ -138,7 +116,8 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou
let backButton = OWSViewController . createOWSBackButton ( withTarget : self , selector : #selector ( didPressDismissButton ) )
let backButton = OWSViewController . createOWSBackButton ( withTarget : self , selector : #selector ( didPressDismissButton ) )
self . navigationItem . leftBarButtonItem = backButton
self . navigationItem . leftBarButtonItem = backButton
self . navigationItem . titleView = headerView
self . navigationItem . titleView = portraitHeaderView
self . updateTitle ( )
self . updateTitle ( )
if showAllMediaButton {
if showAllMediaButton {
@ -164,8 +143,6 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou
// o n e " P a g e " s o t h e b o u n c e d o e s n ' t m a k e s e n s e .
// o n e " P a g e " s o t h e b o u n c e d o e s n ' t m a k e s e n s e .
pagerScrollView . isScrollEnabled = sliderEnabled
pagerScrollView . isScrollEnabled = sliderEnabled
self . title = " Attachment "
// V i e w s
// V i e w s
let kFooterHeight : CGFloat = 44
let kFooterHeight : CGFloat = 44
@ -232,6 +209,12 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou
self . dismissSelf ( animated : true )
self . dismissSelf ( animated : true )
}
}
override func viewWillTransition ( to size : CGSize , with coordinator : UIViewControllerTransitionCoordinator ) {
super . viewWillTransition ( to : size , with : coordinator )
let isLandscape = size . width > size . height
self . navigationItem . titleView = isLandscape ? nil : self . portraitHeaderView
}
private var shouldHideToolbars : Bool = false {
private var shouldHideToolbars : Bool = false {
didSet {
didSet {
if ( oldValue = = shouldHideToolbars ) {
if ( oldValue = = shouldHideToolbars ) {
@ -588,7 +571,7 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou
return formatter
return formatter
} ( )
} ( )
lazy private var h eaderNameLabel: UILabel = {
lazy private var portraitH eaderNameLabel: UILabel = {
let label = UILabel ( )
let label = UILabel ( )
label . textColor = Theme . navbarTitleColor
label . textColor = Theme . navbarTitleColor
label . font = UIFont . ows_regularFont ( withSize : 17 )
label . font = UIFont . ows_regularFont ( withSize : 17 )
@ -599,7 +582,7 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou
return label
return label
} ( )
} ( )
lazy private var h eaderDateLabel: UILabel = {
lazy private var portraitH eaderDateLabel: UILabel = {
let label = UILabel ( )
let label = UILabel ( )
label . textColor = Theme . navbarTitleColor
label . textColor = Theme . navbarTitleColor
label . font = UIFont . ows_regularFont ( withSize : 12 )
label . font = UIFont . ows_regularFont ( withSize : 12 )
@ -610,6 +593,30 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou
return label
return label
} ( )
} ( )
private lazy var portraitHeaderView : UIView = {
let stackView = UIStackView ( )
stackView . axis = . vertical
stackView . alignment = . center
stackView . spacing = 0
stackView . distribution = . fillProportionally
stackView . addArrangedSubview ( portraitHeaderNameLabel )
stackView . addArrangedSubview ( portraitHeaderDateLabel )
let containerView = UIView ( )
containerView . layoutMargins = UIEdgeInsets ( top : 2 , left : 8 , bottom : 4 , right : 8 )
containerView . addSubview ( stackView )
stackView . autoPinEdge ( toSuperviewMargin : . top , relation : . greaterThanOrEqual )
stackView . autoPinEdge ( toSuperviewMargin : . trailing , relation : . greaterThanOrEqual )
stackView . autoPinEdge ( toSuperviewMargin : . bottom , relation : . greaterThanOrEqual )
stackView . autoPinEdge ( toSuperviewMargin : . leading , relation : . greaterThanOrEqual )
stackView . setContentHuggingHigh ( )
stackView . autoCenterInSuperview ( )
return containerView
} ( )
private func updateTitle ( ) {
private func updateTitle ( ) {
guard let currentItem = self . currentItem else {
guard let currentItem = self . currentItem else {
owsFailDebug ( " currentItem was unexpectedly nil " )
owsFailDebug ( " currentItem was unexpectedly nil " )
@ -620,25 +627,30 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou
private func updateTitle ( item : MediaGalleryItem ) {
private func updateTitle ( item : MediaGalleryItem ) {
let name = senderName ( message : item . message )
let name = senderName ( message : item . message )
h eaderNameLabel. text = name
portraitH eaderNameLabel. text = name
// u s e s e n t d a t e
// u s e s e n t d a t e
let date = Date ( timeIntervalSince1970 : Double ( item . message . timestamp ) / 1000 )
let date = Date ( timeIntervalSince1970 : Double ( item . message . timestamp ) / 1000 )
let formattedDate = dateFormatter . string ( from : date )
let formattedDate = dateFormatter . string ( from : date )
headerDateLabel . text = formattedDate
portraitHeaderDateLabel . text = formattedDate
let landscapeHeaderFormat = NSLocalizedString ( " MEDIA_GALLERY_LANDSCAPE_TITLE_FORMAT " , comment : " embeds {{sender name}} and {{sent datetime}}, e.g. 'Sarah on 10/30/18, 3:29' " )
let landscapeHeaderText = String ( format : landscapeHeaderFormat , name , formattedDate )
self . title = landscapeHeaderText
self . navigationItem . title = landscapeHeaderText
if #available ( iOS 11 , * ) {
if #available ( iOS 11 , * ) {
// D o n o t h i n g , o n i O S 1 1 , a u t o l a y o u t g r o w s t h e s t a c k v i e w a s n e c e s s a r y .
// D o n o t h i n g , o n i O S 1 1 + , a u t o l a y o u t g r o w s t h e s t a c k v i e w a s n e c e s s a r y .
} else {
} else {
// S i z e t h e t i t l e V i e w t o b e l a r g e e n o u g h t o f i t t h e w i d e s t l a b e l ,
// S i z e t h e t i t l e V i e w t o b e l a r g e e n o u g h t o f i t t h e w i d e s t l a b e l ,
// b u t n o l a r g e r . I f w e g o f o r a " f u l l w i d t h " l a b e l , o u r t i t l e v i e w
// b u t n o l a r g e r . I f w e g o f o r a " f u l l w i d t h " l a b e l , o u r t i t l e v i e w
// w i l l n o t b e c e n t e r e d ( s i n c e t h e l e f t a n d r i g h t b a r b u t t o n s h a v e d i f f e r e n t w i d t h s )
// w i l l n o t b e c e n t e r e d ( s i n c e t h e l e f t a n d r i g h t b a r b u t t o n s h a v e d i f f e r e n t w i d t h s )
h eaderNameLabel. sizeToFit ( )
portraitH eaderNameLabel. sizeToFit ( )
h eaderDateLabel. sizeToFit ( )
portraitH eaderDateLabel. sizeToFit ( )
let maxWidth = max ( headerNameLabel . frame . width , h eaderDateLabel. frame . width )
let width = max ( portraitHeaderNameLabel . frame . width , portraitH eaderDateLabel. frame . width )
let headerFrame : CGRect = CGRect ( x : 0 , y : 0 , width : maxW idth, height : 44 )
let headerFrame : CGRect = CGRect ( x : 0 , y : 0 , width : w idth, height : 44 )
h eaderView. frame = headerFrame
portraitH eaderView. frame = headerFrame
}
}
}
}
}
}