From 3f33caf91aee3eac1927dacbe4ff31bceb3df898 Mon Sep 17 00:00:00 2001 From: ryanzhao Date: Wed, 25 Jan 2023 14:52:44 +1100 Subject: [PATCH] wip: carousel view --- Session.xcodeproj/project.pbxproj | 4 ++ .../MediaInfoVC+MediaInfoView.swift | 2 +- .../Media Viewing & Editing/MediaInfoVC.swift | 11 ++- Session/Shared/SessionCarouselView.swift | 68 +++++++++++++++++++ 4 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 Session/Shared/SessionCarouselView.swift diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index 920ed78ab..2ce2419ee 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -112,6 +112,7 @@ 7B2561C22978B307005C086C /* MediaInfoVC+MediaInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B2561C12978B307005C086C /* MediaInfoVC+MediaInfoView.swift */; }; 7B3A392E2977791E002FE4AC /* MediaInfoVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3A392D2977791E002FE4AC /* MediaInfoVC.swift */; }; 7B3A3930297A3919002FE4AC /* MediaInfoVC+MediaPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3A392F297A3919002FE4AC /* MediaInfoVC+MediaPreviewView.swift */; }; + 7B3A39322980D02B002FE4AC /* SessionCarouselView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3A39312980D02B002FE4AC /* SessionCarouselView.swift */; }; 7B46AAAF28766DF4001AF2DC /* AllMediaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B46AAAE28766DF4001AF2DC /* AllMediaViewController.swift */; }; 7B4C75CB26B37E0F0000AC89 /* UnsendRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B4C75CA26B37E0F0000AC89 /* UnsendRequest.swift */; }; 7B4C75CD26BB92060000AC89 /* DeletedMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B4C75CC26BB92060000AC89 /* DeletedMessageView.swift */; }; @@ -1181,6 +1182,7 @@ 7B2DB2AD26F1B0FF0035B509 /* si */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = si; path = si.lproj/Localizable.strings; sourceTree = ""; }; 7B3A392D2977791E002FE4AC /* MediaInfoVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaInfoVC.swift; sourceTree = ""; }; 7B3A392F297A3919002FE4AC /* MediaInfoVC+MediaPreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MediaInfoVC+MediaPreviewView.swift"; sourceTree = ""; }; + 7B3A39312980D02B002FE4AC /* SessionCarouselView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionCarouselView.swift; sourceTree = ""; }; 7B46AAAE28766DF4001AF2DC /* AllMediaViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllMediaViewController.swift; sourceTree = ""; }; 7B4C75CA26B37E0F0000AC89 /* UnsendRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnsendRequest.swift; sourceTree = ""; }; 7B4C75CC26BB92060000AC89 /* DeletedMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeletedMessageView.swift; sourceTree = ""; }; @@ -2584,6 +2586,7 @@ FD52090828B59411006098F6 /* ScreenLockUI.swift */, FD37EA0828AA2D27003AE748 /* SessionTableViewModel.swift */, FD37EA0628AA2CCA003AE748 /* SessionTableViewController.swift */, + 7B3A39312980D02B002FE4AC /* SessionCarouselView.swift */, ); path = Shared; sourceTree = ""; @@ -5765,6 +5768,7 @@ FD71163828E2C50700B47552 /* SessionTableViewModel.swift in Sources */, FD71164A28E3EA5B00B47552 /* DismissType.swift in Sources */, C328251F25CA3A900062D0A7 /* QuoteView.swift in Sources */, + 7B3A39322980D02B002FE4AC /* SessionCarouselView.swift in Sources */, FD37E9CC28A1E578003AE748 /* AppearanceViewController.swift in Sources */, B8EB20F02640F7F000773E52 /* OpenGroupInvitationView.swift in Sources */, C328254025CA55880062D0A7 /* ContextMenuVC.swift in Sources */, diff --git a/Session/Media Viewing & Editing/MediaInfoVC+MediaInfoView.swift b/Session/Media Viewing & Editing/MediaInfoVC+MediaInfoView.swift index f75c96ba5..866bf7bcb 100644 --- a/Session/Media Viewing & Editing/MediaInfoVC+MediaInfoView.swift +++ b/Session/Media Viewing & Editing/MediaInfoVC+MediaInfoView.swift @@ -54,7 +54,7 @@ extension MediaInfoVC { // MARK: - Lifecycle - init(attachment: Attachment? = nil) { + init(attachment: Attachment?) { self.attachment = attachment super.init(frame: CGRect.zero) diff --git a/Session/Media Viewing & Editing/MediaInfoVC.swift b/Session/Media Viewing & Editing/MediaInfoVC.swift index 33a808d62..46af1170a 100644 --- a/Session/Media Viewing & Editing/MediaInfoVC.swift +++ b/Session/Media Viewing & Editing/MediaInfoVC.swift @@ -11,7 +11,7 @@ final class MediaInfoVC: BaseVC { private let isOutgoing: Bool // MARK: - UI - private lazy var mediaInfoView: MediaInfoView = MediaInfoView() + private lazy var mediaInfoView: MediaInfoView = MediaInfoView(attachment: nil) // MARK: - Initialization @@ -50,11 +50,18 @@ final class MediaInfoVC: BaseVC { mediaStackView.addArrangedSubview(mediaPreviewView) } + let contentWidth: CGFloat = Self.mediaSize * CGFloat(attachments.count) + let contentHeight: CGFloat = Self.mediaSize + mediaStackView.set(.width, to: contentWidth) + mediaStackView.set(.height, to: contentHeight) + let scrollView: UIScrollView = UIScrollView() scrollView.isPagingEnabled = true + scrollView.showsVerticalScrollIndicator = false + scrollView.showsHorizontalScrollIndicator = false scrollView.set(.width, to: Self.mediaSize) scrollView.set(.height, to: Self.mediaSize) - scrollView.contentSize = CGSize(width: Self.mediaSize * CGFloat(attachments.count), height: Self.mediaSize) + scrollView.contentSize = CGSize(width: contentWidth, height: contentHeight) scrollView.addSubview(mediaStackView) mediaInfoView.update(attachment: attachments[0]) diff --git a/Session/Shared/SessionCarouselView.swift b/Session/Shared/SessionCarouselView.swift new file mode 100644 index 000000000..47277d99a --- /dev/null +++ b/Session/Shared/SessionCarouselView.swift @@ -0,0 +1,68 @@ +// Copyright © 2023 Rangeproof Pty Ltd. All rights reserved. + +import Foundation + +final class SessionCarouselView: UIView { + private let slices: [UIView] + private let sliceSize: CGSize + + // MARK: - Settings + public var showPageControl: Bool = true { + didSet { + self.pageControl.isHidden = !showPageControl + } + } + + // MARK: - UI + private lazy var scrollView: UIScrollView = { + let result: UIScrollView = UIScrollView() + result.isPagingEnabled = true + result.showsHorizontalScrollIndicator = false + result.showsVerticalScrollIndicator = false + result.contentSize = CGSize( + width: self.sliceSize.width * CGFloat(self.slices.count), + height: self.sliceSize.height + ) + + return result + }() + + private lazy var pageControl: UIPageControl = { + let result: UIPageControl = UIPageControl() + result.numberOfPages = self.slices.count + + return result + }() + + // MARK: - Lifecycle + init(slices: [UIView], sliceSize: CGSize) { + self.slices = slices + self.sliceSize = sliceSize + + super.init(frame: CGRect.zero) + setUpViewHierarchy() + } + + override init(frame: CGRect) { + preconditionFailure("Use init(attachment:) instead.") + } + + required init?(coder: NSCoder) { + preconditionFailure("Use init(attachment:) instead.") + } + + private func setUpViewHierarchy() { + let stackView: UIStackView = UIStackView(arrangedSubviews: self.slices) + stackView.axis = .horizontal + stackView.set(.width, to: self.sliceSize.width * CGFloat(self.slices.count)) + stackView.set(.height, to: self.sliceSize.height) + + addSubview(self.scrollView) + scrollView.pin(to: self) + scrollView.addSubview(stackView) + + addSubview(self.pageControl) + self.pageControl.center(.horizontal, in: self) + self.pageControl.pin(.bottom, to: .bottom, of: self) + } +}