implement carousel view delegate
This commit is contained in:
parent
723beed101
commit
78cea3ac29
|
@ -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 */,
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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])
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
// Copyright © 2023 Rangeproof Pty Ltd. All rights reserved.
|
||||
|
||||
import Foundation
|
||||
|
||||
public protocol SessionCarouselViewDelegate: AnyObject {
|
||||
func carouselViewDidScrollToNewSlice(currentPage: Int)
|
||||
}
|
Loading…
Reference in New Issue