forked from zelo72/mastodon-ios
74 lines
2.0 KiB
Swift
74 lines
2.0 KiB
Swift
//
|
|
// MediaPreviewTransitionItem.swift
|
|
// Mastodon
|
|
//
|
|
// Created by MainasuK Cirno on 2021-4-28.
|
|
//
|
|
|
|
import UIKit
|
|
import CoreData
|
|
import MastodonUI
|
|
|
|
class MediaPreviewTransitionItem: Identifiable {
|
|
|
|
let id: UUID
|
|
let source: Source
|
|
var previewableViewController: MediaPreviewableViewController
|
|
|
|
// source
|
|
var image: UIImage?
|
|
var aspectRatio: CGSize?
|
|
var initialFrame: CGRect? = nil
|
|
var sourceImageView: UIImageView?
|
|
var sourceImageViewCornerRadius: CGFloat?
|
|
|
|
// target
|
|
var targetFrame: CGRect? = nil
|
|
|
|
// transitioning
|
|
var transitionView: UIView?
|
|
var snapshotRaw: UIView?
|
|
var snapshotTransitioning: UIView?
|
|
var touchOffset: CGVector = CGVector.zero
|
|
var interactiveTransitionMaskView: UIView?
|
|
var interactiveTransitionMaskLayer: CAShapeLayer?
|
|
|
|
init(
|
|
id: UUID = UUID(),
|
|
source: Source,
|
|
previewableViewController: MediaPreviewableViewController
|
|
) {
|
|
self.id = id
|
|
self.source = source
|
|
self.previewableViewController = previewableViewController
|
|
}
|
|
|
|
}
|
|
|
|
extension MediaPreviewTransitionItem {
|
|
enum Source {
|
|
case attachment(MediaView)
|
|
case attachments(MediaGridContainerView)
|
|
case profileAvatar(ProfileHeaderView)
|
|
case profileBanner(ProfileHeaderView)
|
|
|
|
func updateAppearance(position: UIViewAnimatingPosition, index: Int?) {
|
|
let alpha: CGFloat = position == .end ? 1 : 0
|
|
switch self {
|
|
case .attachment(let mediaView):
|
|
mediaView.alpha = alpha
|
|
case .attachments(let mediaGridContainerView):
|
|
if let index = index {
|
|
mediaGridContainerView.setAlpha(alpha, index: index)
|
|
} else {
|
|
mediaGridContainerView.setAlpha(alpha)
|
|
}
|
|
case .profileAvatar(let profileHeaderView):
|
|
profileHeaderView.avatarButton.alpha = alpha
|
|
case .profileBanner:
|
|
break // keep source
|
|
}
|
|
}
|
|
}
|
|
}
|