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 */; };
|
7B3A392E2977791E002FE4AC /* MediaInfoVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3A392D2977791E002FE4AC /* MediaInfoVC.swift */; };
|
||||||
7B3A3930297A3919002FE4AC /* MediaInfoVC+MediaPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3A392F297A3919002FE4AC /* MediaInfoVC+MediaPreviewView.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 */; };
|
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 */; };
|
7B46AAAF28766DF4001AF2DC /* AllMediaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B46AAAE28766DF4001AF2DC /* AllMediaViewController.swift */; };
|
||||||
7B4C75CB26B37E0F0000AC89 /* UnsendRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B4C75CA26B37E0F0000AC89 /* UnsendRequest.swift */; };
|
7B4C75CB26B37E0F0000AC89 /* UnsendRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B4C75CA26B37E0F0000AC89 /* UnsendRequest.swift */; };
|
||||||
7B4C75CD26BB92060000AC89 /* DeletedMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B4C75CC26BB92060000AC89 /* DeletedMessageView.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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
7B4C75CC26BB92060000AC89 /* DeletedMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeletedMessageView.swift; sourceTree = "<group>"; };
|
||||||
|
@ -2590,6 +2592,7 @@
|
||||||
FD37EA0628AA2CCA003AE748 /* SessionTableViewController.swift */,
|
FD37EA0628AA2CCA003AE748 /* SessionTableViewController.swift */,
|
||||||
7B3A39312980D02B002FE4AC /* SessionCarouselView.swift */,
|
7B3A39312980D02B002FE4AC /* SessionCarouselView.swift */,
|
||||||
7B2561C329874851005C086C /* SessionCarouselView+Info.swift */,
|
7B2561C329874851005C086C /* SessionCarouselView+Info.swift */,
|
||||||
|
7B3A3933298882D6002FE4AC /* SessionCarouselViewDelegate.swift */,
|
||||||
);
|
);
|
||||||
path = Shared;
|
path = Shared;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -5702,6 +5705,7 @@
|
||||||
FD71164228E2C85A00B47552 /* TransitionType.swift in Sources */,
|
FD71164228E2C85A00B47552 /* TransitionType.swift in Sources */,
|
||||||
FD848B9828422F1A000E298B /* Date+Utilities.swift in Sources */,
|
FD848B9828422F1A000E298B /* Date+Utilities.swift in Sources */,
|
||||||
FD37E9DB28A244E9003AE748 /* ThemePreviewView.swift in Sources */,
|
FD37E9DB28A244E9003AE748 /* ThemePreviewView.swift in Sources */,
|
||||||
|
7B3A3934298882D6002FE4AC /* SessionCarouselViewDelegate.swift in Sources */,
|
||||||
B85357C323A1BD1200AAF6CD /* SeedVC.swift in Sources */,
|
B85357C323A1BD1200AAF6CD /* SeedVC.swift in Sources */,
|
||||||
45B5360E206DD8BB00D61655 /* UIResponder+OWS.swift in Sources */,
|
45B5360E206DD8BB00D61655 /* UIResponder+OWS.swift in Sources */,
|
||||||
7B9F71C928470667006DFE7B /* ReactionListSheet.swift in Sources */,
|
7B9F71C928470667006DFE7B /* ReactionListSheet.swift in Sources */,
|
||||||
|
|
|
@ -23,23 +23,6 @@ extension MediaInfoVC {
|
||||||
return result
|
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
|
// MARK: - Lifecycle
|
||||||
|
|
||||||
init(attachment: Attachment, isOutgoing: Bool) {
|
init(attachment: Attachment, isOutgoing: Bool) {
|
||||||
|
@ -66,20 +49,12 @@ extension MediaInfoVC {
|
||||||
addSubview(mediaView)
|
addSubview(mediaView)
|
||||||
mediaView.pin(to: self)
|
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()
|
mediaView.loadMedia()
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Interaction
|
|
||||||
|
|
||||||
@objc func showMediaFullScreen() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Copy
|
// MARK: - Copy
|
||||||
|
|
||||||
|
/// This function is used to make sure the carousel view contains this class can loop infinitely
|
||||||
func copyView() -> MediaPreviewView {
|
func copyView() -> MediaPreviewView {
|
||||||
return MediaPreviewView(attachment: self.attachment, isOutgoing: self.isOutgoing)
|
return MediaPreviewView(attachment: self.attachment, isOutgoing: self.isOutgoing)
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,8 +4,9 @@ import UIKit
|
||||||
import SessionUIKit
|
import SessionUIKit
|
||||||
import SessionUtilitiesKit
|
import SessionUtilitiesKit
|
||||||
|
|
||||||
final class MediaInfoVC: BaseVC {
|
final class MediaInfoVC: BaseVC, SessionCarouselViewDelegate {
|
||||||
internal static let mediaSize: CGFloat = 293
|
internal static let mediaSize: CGFloat = 293
|
||||||
|
internal static let arrowSize: CGSize = CGSize(width: 20, height: 30)
|
||||||
|
|
||||||
private let attachments: [Attachment]
|
private let attachments: [Attachment]
|
||||||
private let isOutgoing: Bool
|
private let isOutgoing: Bool
|
||||||
|
@ -35,14 +36,29 @@ final class MediaInfoVC: BaseVC {
|
||||||
bottomInset: Values.mediumSpacing
|
bottomInset: Values.mediumSpacing
|
||||||
),
|
),
|
||||||
shouldShowArrows: true,
|
shouldShowArrows: true,
|
||||||
arrowsSize: CGSize(
|
arrowsSize: Self.arrowSize,
|
||||||
width: 20,
|
|
||||||
height: 30
|
|
||||||
),
|
|
||||||
cornerRadius: 8
|
cornerRadius: 8
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
result.set(.height, to: Self.mediaSize)
|
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
|
return result
|
||||||
}()
|
}()
|
||||||
|
@ -79,6 +95,10 @@ final class MediaInfoVC: BaseVC {
|
||||||
|
|
||||||
mediaInfoView.update(attachment: attachments[0])
|
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 ])
|
let stackView: UIStackView = UIStackView(arrangedSubviews: [ mediaCarouselView, mediaInfoView ])
|
||||||
stackView.axis = .vertical
|
stackView.axis = .vertical
|
||||||
stackView.alignment = .center
|
stackView.alignment = .center
|
||||||
|
@ -88,4 +108,16 @@ final class MediaInfoVC: BaseVC {
|
||||||
stackView.pin([ UIView.HorizontalEdge.leading, UIView.HorizontalEdge.trailing ], to: self.view)
|
stackView.pin([ UIView.HorizontalEdge.leading, UIView.HorizontalEdge.trailing ], to: self.view)
|
||||||
stackView.center(.vertical, in: 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 {
|
final class SessionCarouselView: UIView, UIScrollViewDelegate {
|
||||||
private let slicesForLoop: [UIView]
|
private let slicesForLoop: [UIView]
|
||||||
private let info: SessionCarouselView.Info
|
private let info: SessionCarouselView.Info
|
||||||
|
var delegate: SessionCarouselViewDelegate?
|
||||||
|
|
||||||
// MARK: - UI
|
// MARK: - UI
|
||||||
private lazy var scrollView: UIScrollView = {
|
private lazy var scrollView: UIScrollView = {
|
||||||
|
@ -146,10 +147,12 @@ final class SessionCarouselView: UIView, UIScrollViewDelegate {
|
||||||
|
|
||||||
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
|
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
|
||||||
setCorrectCotentOffsetIfNeeded(scrollView)
|
setCorrectCotentOffsetIfNeeded(scrollView)
|
||||||
|
delegate?.carouselViewDidScrollToNewSlice(currentPage: pageControl.currentPage)
|
||||||
}
|
}
|
||||||
|
|
||||||
func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
|
func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
|
||||||
setCorrectCotentOffsetIfNeeded(scrollView)
|
setCorrectCotentOffsetIfNeeded(scrollView)
|
||||||
|
delegate?.carouselViewDidScrollToNewSlice(currentPage: pageControl.currentPage)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func setCorrectCotentOffsetIfNeeded(_ scrollView: UIScrollView) {
|
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