implement carousel view delegate

This commit is contained in:
ryanzhao 2023-01-31 11:06:06 +11:00
parent 723beed101
commit 78cea3ac29
5 changed files with 53 additions and 32 deletions

View File

@ -114,6 +114,7 @@
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 */; };
7B3A3934298882D6002FE4AC /* SessionCarouselViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3A3933298882D6002FE4AC /* SessionCarouselViewDelegate.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 */; };
@ -1185,6 +1186,7 @@
7B3A392D2977791E002FE4AC /* MediaInfoVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaInfoVC.swift; sourceTree = "<group>"; };
7B3A392F297A3919002FE4AC /* MediaInfoVC+MediaPreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MediaInfoVC+MediaPreviewView.swift"; sourceTree = "<group>"; };
7B3A39312980D02B002FE4AC /* SessionCarouselView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionCarouselView.swift; sourceTree = "<group>"; };
7B3A3933298882D6002FE4AC /* SessionCarouselViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionCarouselViewDelegate.swift; sourceTree = "<group>"; };
7B46AAAE28766DF4001AF2DC /* AllMediaViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllMediaViewController.swift; sourceTree = "<group>"; };
7B4C75CA26B37E0F0000AC89 /* UnsendRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnsendRequest.swift; sourceTree = "<group>"; };
7B4C75CC26BB92060000AC89 /* DeletedMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeletedMessageView.swift; sourceTree = "<group>"; };
@ -2590,6 +2592,7 @@
FD37EA0628AA2CCA003AE748 /* SessionTableViewController.swift */,
7B3A39312980D02B002FE4AC /* SessionCarouselView.swift */,
7B2561C329874851005C086C /* SessionCarouselView+Info.swift */,
7B3A3933298882D6002FE4AC /* SessionCarouselViewDelegate.swift */,
);
path = Shared;
sourceTree = "<group>";
@ -5702,6 +5705,7 @@
FD71164228E2C85A00B47552 /* TransitionType.swift in Sources */,
FD848B9828422F1A000E298B /* Date+Utilities.swift in Sources */,
FD37E9DB28A244E9003AE748 /* ThemePreviewView.swift in Sources */,
7B3A3934298882D6002FE4AC /* SessionCarouselViewDelegate.swift in Sources */,
B85357C323A1BD1200AAF6CD /* SeedVC.swift in Sources */,
45B5360E206DD8BB00D61655 /* UIResponder+OWS.swift in Sources */,
7B9F71C928470667006DFE7B /* ReactionListSheet.swift in Sources */,

View File

@ -23,23 +23,6 @@ extension MediaInfoVC {
return result
}()
private lazy var fullScreenButton: UIButton = {
let result: UIButton = UIButton(type: .custom)
result.setImage(
UIImage(systemName: "arrow.up.left.and.arrow.down.right")?
.withRenderingMode(.alwaysTemplate),
for: .normal
)
result.themeTintColor = .textPrimary
result.backgroundColor = .init(white: 0, alpha: 0.4)
result.layer.cornerRadius = 14
result.set(.width, to: 28)
result.set(.height, to: 28)
result.addTarget(self, action: #selector(showMediaFullScreen), for: .touchUpInside)
return result
}()
// MARK: - Lifecycle
init(attachment: Attachment, isOutgoing: Bool) {
@ -66,20 +49,12 @@ extension MediaInfoVC {
addSubview(mediaView)
mediaView.pin(to: self)
addSubview(fullScreenButton)
fullScreenButton.pin(.trailing, to: .trailing, of: self, withInset: -Values.smallSpacing)
fullScreenButton.pin(.bottom, to: .bottom, of: self, withInset: -Values.smallSpacing)
mediaView.loadMedia()
}
// MARK: - Interaction
@objc func showMediaFullScreen() {
}
// MARK: - Copy
/// This function is used to make sure the carousel view contains this class can loop infinitely
func copyView() -> MediaPreviewView {
return MediaPreviewView(attachment: self.attachment, isOutgoing: self.isOutgoing)
}

View File

@ -4,8 +4,9 @@ import UIKit
import SessionUIKit
import SessionUtilitiesKit
final class MediaInfoVC: BaseVC {
final class MediaInfoVC: BaseVC, SessionCarouselViewDelegate {
internal static let mediaSize: CGFloat = 293
internal static let arrowSize: CGSize = CGSize(width: 20, height: 30)
private let attachments: [Attachment]
private let isOutgoing: Bool
@ -35,14 +36,29 @@ final class MediaInfoVC: BaseVC {
bottomInset: Values.mediumSpacing
),
shouldShowArrows: true,
arrowsSize: CGSize(
width: 20,
height: 30
),
arrowsSize: Self.arrowSize,
cornerRadius: 8
)
)
result.set(.height, to: Self.mediaSize)
result.delegate = self
return result
}()
private lazy var fullScreenButton: UIButton = {
let result: UIButton = UIButton(type: .custom)
result.setImage(
UIImage(systemName: "arrow.up.left.and.arrow.down.right")?
.withRenderingMode(.alwaysTemplate),
for: .normal
)
result.themeTintColor = .textPrimary
result.backgroundColor = .init(white: 0, alpha: 0.4)
result.layer.cornerRadius = 14
result.set(.width, to: 28)
result.set(.height, to: 28)
result.addTarget(self, action: #selector(showMediaFullScreen), for: .touchUpInside)
return result
}()
@ -79,6 +95,10 @@ final class MediaInfoVC: BaseVC {
mediaInfoView.update(attachment: attachments[0])
mediaCarouselView.addSubview(fullScreenButton)
fullScreenButton.pin(.trailing, to: .trailing, of: mediaCarouselView, withInset: -(Values.smallSpacing + Self.arrowSize.width + Values.largeSpacing))
fullScreenButton.pin(.bottom, to: .bottom, of: mediaCarouselView, withInset: -Values.smallSpacing)
let stackView: UIStackView = UIStackView(arrangedSubviews: [ mediaCarouselView, mediaInfoView ])
stackView.axis = .vertical
stackView.alignment = .center
@ -88,4 +108,16 @@ final class MediaInfoVC: BaseVC {
stackView.pin([ UIView.HorizontalEdge.leading, UIView.HorizontalEdge.trailing ], to: self.view)
stackView.center(.vertical, in: self.view)
}
// MARK: - Interaction
@objc func showMediaFullScreen() {
}
// MARK: - SessionCarouselViewDelegate
func carouselViewDidScrollToNewSlice(currentPage: Int) {
mediaInfoView.update(attachment: attachments[currentPage])
}
}

View File

@ -7,6 +7,7 @@ import SessionUtilitiesKit
final class SessionCarouselView: UIView, UIScrollViewDelegate {
private let slicesForLoop: [UIView]
private let info: SessionCarouselView.Info
var delegate: SessionCarouselViewDelegate?
// MARK: - UI
private lazy var scrollView: UIScrollView = {
@ -146,10 +147,12 @@ final class SessionCarouselView: UIView, UIScrollViewDelegate {
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
setCorrectCotentOffsetIfNeeded(scrollView)
delegate?.carouselViewDidScrollToNewSlice(currentPage: pageControl.currentPage)
}
func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
setCorrectCotentOffsetIfNeeded(scrollView)
delegate?.carouselViewDidScrollToNewSlice(currentPage: pageControl.currentPage)
}
private func setCorrectCotentOffsetIfNeeded(_ scrollView: UIScrollView) {

View File

@ -0,0 +1,7 @@
// Copyright © 2023 Rangeproof Pty Ltd. All rights reserved.
import Foundation
public protocol SessionCarouselViewDelegate: AnyObject {
func carouselViewDidScrollToNewSlice(currentPage: Int)
}