chore: add media type with gif and video
This commit is contained in:
parent
2e31280819
commit
6b5edff677
|
@ -210,8 +210,7 @@ extension StatusSection {
|
||||||
playerViewController.delegate = cell.delegate?.playerViewControllerDelegate
|
playerViewController.delegate = cell.delegate?.playerViewControllerDelegate
|
||||||
playerViewController.player = videoPlayerViewModel.player
|
playerViewController.player = videoPlayerViewModel.player
|
||||||
playerViewController.showsPlaybackControls = videoPlayerViewModel.videoKind != .gif
|
playerViewController.showsPlaybackControls = videoPlayerViewModel.videoKind != .gif
|
||||||
|
playerContainerView.setMediaKind(kind: videoPlayerViewModel.videoKind)
|
||||||
playerContainerView.gifIndicatorLabel.isHidden = videoPlayerViewModel.videoKind != .gif
|
|
||||||
playerContainerView.isHidden = false
|
playerContainerView.isHidden = false
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -37,6 +37,7 @@ internal enum Asset {
|
||||||
internal static let disabled = ColorAsset(name: "Colors/Background/Poll/disabled")
|
internal static let disabled = ColorAsset(name: "Colors/Background/Poll/disabled")
|
||||||
internal static let highlight = ColorAsset(name: "Colors/Background/Poll/highlight")
|
internal static let highlight = ColorAsset(name: "Colors/Background/Poll/highlight")
|
||||||
}
|
}
|
||||||
|
internal static let mediaTypeIndicotor = ColorAsset(name: "Colors/Background/mediaTypeIndicotor")
|
||||||
internal static let onboardingBackground = ColorAsset(name: "Colors/Background/onboarding.background")
|
internal static let onboardingBackground = ColorAsset(name: "Colors/Background/onboarding.background")
|
||||||
internal static let secondaryGroupedSystemBackground = ColorAsset(name: "Colors/Background/secondary.grouped.system.background")
|
internal static let secondaryGroupedSystemBackground = ColorAsset(name: "Colors/Background/secondary.grouped.system.background")
|
||||||
internal static let secondarySystemBackground = ColorAsset(name: "Colors/Background/secondary.system.background")
|
internal static let secondarySystemBackground = ColorAsset(name: "Colors/Background/secondary.system.background")
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
"colors" : [
|
||||||
|
{
|
||||||
|
"color" : {
|
||||||
|
"color-space" : "srgb",
|
||||||
|
"components" : {
|
||||||
|
"alpha" : "0.600",
|
||||||
|
"blue" : "0",
|
||||||
|
"green" : "0",
|
||||||
|
"red" : "0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
|
@ -26,14 +26,28 @@ final class PlayerContainerView: UIView {
|
||||||
|
|
||||||
let playerViewController = AVPlayerViewController()
|
let playerViewController = AVPlayerViewController()
|
||||||
|
|
||||||
let gifIndicatorLabel: UILabel = {
|
let mediaTypeIndicotorLabel: UILabel = {
|
||||||
let label = UILabel()
|
let label = UILabel()
|
||||||
label.font = .systemFont(ofSize: 16, weight: .heavy)
|
label.font = .systemFont(ofSize: 18, weight: .heavy)
|
||||||
label.text = "GIF"
|
|
||||||
label.textColor = .white
|
label.textColor = .white
|
||||||
|
label.textAlignment = .right
|
||||||
|
label.translatesAutoresizingMaskIntoConstraints = false
|
||||||
return label
|
return label
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
let mediaTypeIndicotorView: UIView = {
|
||||||
|
let view = UIView()
|
||||||
|
view.backgroundColor = Asset.Colors.Background.mediaTypeIndicotor.color
|
||||||
|
view.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
let rect = CGRect(x: 0, y: 0, width: 47, height: 50)
|
||||||
|
let path = UIBezierPath(roundedRect: rect, byRoundingCorners: [.topLeft], cornerRadii: CGSize(width: 50, height: 50))
|
||||||
|
let maskLayer = CAShapeLayer()
|
||||||
|
maskLayer.frame = rect
|
||||||
|
maskLayer.path = path.cgPath
|
||||||
|
view.layer.mask = maskLayer
|
||||||
|
return view
|
||||||
|
}()
|
||||||
|
|
||||||
weak var delegate: PlayerContainerViewDelegate?
|
weak var delegate: PlayerContainerViewDelegate?
|
||||||
|
|
||||||
override init(frame: CGRect) {
|
override init(frame: CGRect) {
|
||||||
|
@ -60,14 +74,6 @@ extension PlayerContainerView {
|
||||||
containerHeightLayoutConstraint,
|
containerHeightLayoutConstraint,
|
||||||
])
|
])
|
||||||
|
|
||||||
addSubview(gifIndicatorLabel)
|
|
||||||
gifIndicatorLabel.translatesAutoresizingMaskIntoConstraints = false
|
|
||||||
|
|
||||||
NSLayoutConstraint.activate([
|
|
||||||
gifIndicatorLabel.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 4),
|
|
||||||
gifIndicatorLabel.trailingAnchor.constraint(equalTo: trailingAnchor)
|
|
||||||
])
|
|
||||||
|
|
||||||
// will not influence full-screen playback
|
// will not influence full-screen playback
|
||||||
playerViewController.view.layer.masksToBounds = true
|
playerViewController.view.layer.masksToBounds = true
|
||||||
playerViewController.view.layer.cornerRadius = PlayerContainerView.cornerRadius
|
playerViewController.view.layer.cornerRadius = PlayerContainerView.cornerRadius
|
||||||
|
@ -80,8 +86,24 @@ extension PlayerContainerView {
|
||||||
contentWarningOverlayView.trailingAnchor.constraint(equalTo: trailingAnchor),
|
contentWarningOverlayView.trailingAnchor.constraint(equalTo: trailingAnchor),
|
||||||
contentWarningOverlayView.bottomAnchor.constraint(equalTo: bottomAnchor)
|
contentWarningOverlayView.bottomAnchor.constraint(equalTo: bottomAnchor)
|
||||||
])
|
])
|
||||||
|
|
||||||
contentWarningOverlayView.delegate = self
|
contentWarningOverlayView.delegate = self
|
||||||
|
|
||||||
|
// mediaType
|
||||||
|
addSubview(mediaTypeIndicotorView)
|
||||||
|
NSLayoutConstraint.activate([
|
||||||
|
mediaTypeIndicotorView.bottomAnchor.constraint(equalTo: bottomAnchor),
|
||||||
|
mediaTypeIndicotorView.trailingAnchor.constraint(equalTo: trailingAnchor),
|
||||||
|
mediaTypeIndicotorView.heightAnchor.constraint(equalToConstant: 25),
|
||||||
|
mediaTypeIndicotorView.widthAnchor.constraint(equalToConstant: 47)
|
||||||
|
])
|
||||||
|
|
||||||
|
mediaTypeIndicotorView.addSubview(mediaTypeIndicotorLabel)
|
||||||
|
NSLayoutConstraint.activate([
|
||||||
|
mediaTypeIndicotorLabel.topAnchor.constraint(equalTo: mediaTypeIndicotorView.topAnchor),
|
||||||
|
mediaTypeIndicotorLabel.leadingAnchor.constraint(equalTo: mediaTypeIndicotorView.leadingAnchor),
|
||||||
|
mediaTypeIndicotorLabel.bottomAnchor.constraint(equalTo: mediaTypeIndicotorView.bottomAnchor),
|
||||||
|
mediaTypeIndicotorView.trailingAnchor.constraint(equalTo: mediaTypeIndicotorLabel.trailingAnchor, constant: 8)
|
||||||
|
])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,8 +118,6 @@ extension PlayerContainerView {
|
||||||
func reset() {
|
func reset() {
|
||||||
// note: set playerViewController.player pause() and nil in data source configuration process make reloadData not break playing
|
// note: set playerViewController.player pause() and nil in data source configuration process make reloadData not break playing
|
||||||
|
|
||||||
gifIndicatorLabel.removeFromSuperview()
|
|
||||||
|
|
||||||
playerViewController.willMove(toParent: nil)
|
playerViewController.willMove(toParent: nil)
|
||||||
playerViewController.view.removeFromSuperview()
|
playerViewController.view.removeFromSuperview()
|
||||||
playerViewController.removeFromParent()
|
playerViewController.removeFromParent()
|
||||||
|
@ -137,13 +157,21 @@ extension PlayerContainerView {
|
||||||
containerHeightLayoutConstraint.constant = floor(rect.height)
|
containerHeightLayoutConstraint.constant = floor(rect.height)
|
||||||
containerHeightLayoutConstraint.isActive = true
|
containerHeightLayoutConstraint.isActive = true
|
||||||
|
|
||||||
gifIndicatorLabel.translatesAutoresizingMaskIntoConstraints = false
|
bringSubviewToFront(mediaTypeIndicotorView)
|
||||||
touchBlockingView.addSubview(gifIndicatorLabel)
|
|
||||||
NSLayoutConstraint.activate([
|
|
||||||
touchBlockingView.trailingAnchor.constraint(equalTo: gifIndicatorLabel.trailingAnchor, constant: 8),
|
|
||||||
touchBlockingView.bottomAnchor.constraint(equalTo: gifIndicatorLabel.bottomAnchor, constant: 8),
|
|
||||||
])
|
|
||||||
|
|
||||||
return playerViewController
|
return playerViewController
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setMediaKind(kind: VideoPlayerViewModel.Kind) {
|
||||||
|
switch kind {
|
||||||
|
case .gif:
|
||||||
|
mediaTypeIndicotorLabel.text = "GIF"
|
||||||
|
case .video:
|
||||||
|
let configuration = UIImage.SymbolConfiguration(font: .systemFont(ofSize: 18, weight: .regular))
|
||||||
|
let image = UIImage(systemName: "video.fill", withConfiguration: configuration)!
|
||||||
|
let attachment = NSTextAttachment()
|
||||||
|
attachment.image = image.withTintColor(.white)
|
||||||
|
mediaTypeIndicotorLabel.attributedText = NSAttributedString(attachment: attachment)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue