Commit 68aabe60 authored by Alex朱枝文's avatar Alex朱枝文

直播间手势控制消息列表显示与隐藏

parent 8189e63d
...@@ -31,6 +31,9 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -31,6 +31,9 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
private let timeCount: Int = 120 private let timeCount: Int = 120
// 进聊天室尝试次数 // 进聊天室尝试次数
private let maxRetryCount = 3 private let maxRetryCount = 3
// 手势初始状态记录
private var originalX: CGFloat = 0
private var isMessageListHidden = false
// MARK: - UI Components // MARK: - UI Components
...@@ -95,6 +98,23 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -95,6 +98,23 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
let imageView = UIImageView(image: UIImage(named: "live_player_bg")) let imageView = UIImageView(image: UIImage(named: "live_player_bg"))
return imageView return imageView
}() }()
private lazy var messageListStateButton: UIButton = {
let button = UIButton(type: .custom)
button.setImage(UIImage(named: "live_message_show"), for: .selected)
button.setImage(UIImage(named: "live_message_hide"), for: .normal)
button.addTarget(self, action: #selector(messageListStateButtonClicked(_:)), for: .touchUpInside)
return button
}()
private lazy var closeButton: UIButton = {
let button = UIButton(type: .custom)
button.isHidden = true
button.setImage(UIImage(named: "live_room_close"), for: .normal)
button.addTarget(self, action: #selector(closeButtonClicked), for: .touchUpInside)
button.contentEdgeInsets = UIEdgeInsets(top: 4, left: 4, bottom: 4, right: 4)
return button
}()
// MARK: - Initialization // MARK: - Initialization
...@@ -167,6 +187,8 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -167,6 +187,8 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
//playerView.addSubview(blurredView) //playerView.addSubview(blurredView)
containerView.addSubview(bottomInputBar) containerView.addSubview(bottomInputBar)
containerView.addSubview(messageListView) containerView.addSubview(messageListView)
containerView.addSubview(messageListStateButton)
containerView.addSubview(closeButton)
bottomImageView.snp.makeConstraints { make in bottomImageView.snp.makeConstraints { make in
make.edges.equalToSuperview() make.edges.equalToSuperview()
} }
...@@ -181,6 +203,18 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -181,6 +203,18 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
make.bottom.equalTo(bottomInputBar.snp.top).offset(-14) make.bottom.equalTo(bottomInputBar.snp.top).offset(-14)
make.height.width.equalTo(listMaxWidth) make.height.width.equalTo(listMaxWidth)
} }
messageListStateButton.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-16)
make.bottom.equalTo(bottomInputBar.snp.top).offset(-10)
make.height.width.equalTo(44)
}
closeButton.snp.makeConstraints { make in
make.centerY.equalTo(topBarView.headPortrait)
make.right.equalToSuperview().offset(-12)
make.width.height.equalTo(32)
}
topBarView.closeButtonClickEvent = { [weak self] in topBarView.closeButtonClickEvent = { [weak self] in
self?.closeLive() self?.closeLive()
...@@ -221,6 +255,12 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -221,6 +255,12 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
make.width.equalTo(300) make.width.equalTo(300)
} }
#endif #endif
// 保存初始位置
originalX = messageListView.frame.origin.x
// 添加拖拽手势
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:)))
view.addGestureRecognizer(panGesture)
} }
private func setupStateViewController() { private func setupStateViewController() {
...@@ -701,6 +741,14 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -701,6 +741,14 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
quitChatRoom() quitChatRoom()
} }
@objc private func messageListStateButtonClicked(_ button: UIButton) {
if isMessageListHidden {
showWithAnimation()
} else {
hideWithAnimation()
}
}
/// 设置定时器 /// 设置定时器
private func setupTimer() { private func setupTimer() {
timer = DispatchSource.makeTimerSource(queue: .main) timer = DispatchSource.makeTimerSource(queue: .main)
...@@ -839,3 +887,97 @@ extension YHLivePlayerViewController { ...@@ -839,3 +887,97 @@ extension YHLivePlayerViewController {
} }
*/ */
} }
extension YHLivePlayerViewController {
// MARK: - Gesture Handling
@objc private func closeButtonClicked() {
closeLive()
}
@objc private func handlePanGesture(_ gesture: UIPanGestureRecognizer) {
let translation = gesture.translation(in: view)
switch gesture.state {
case .began:
break
case .changed:
if isMessageListHidden {
// 隐藏状态下,只允许向左拖拽显示
if translation.x <= 0 {
// 计算新位置(从隐藏位置向左拖)
let newX = (originalX + view.frame.width) + translation.x
// 限制不能拖过原始位置
messageListView.frame.origin.x = max(originalX, newX)
topBarView.frame.origin.x = max(originalX, newX)
bottomInputBar.frame.origin.x = max(originalX, newX)
}
} else {
// 显示状态下,只允许向右拖拽隐藏
if translation.x >= 0 {
// 计算新位置(从原始位置向右拖)
let newX = originalX + translation.x
// 限制最大拖拽距离
messageListView.frame.origin.x = min(originalX + view.frame.width, newX)
topBarView.frame.origin.x = min(originalX + view.frame.width, newX)
bottomInputBar.frame.origin.x = min(originalX + view.frame.width, newX)
}
}
case .ended, .cancelled:
let velocity = gesture.velocity(in: view)
let translation = gesture.translation(in: view)
if isMessageListHidden {
// 当前是隐藏状态,判断是否需要显示
if velocity.x < -500 || translation.x < -view.frame.width / 3 {
// 向左速度够快或拖动距离够大,显示
showWithAnimation()
} else {
// 保持隐藏
hideWithAnimation()
}
} else {
// 当前是显示状态,判断是否需要隐藏
if velocity.x > 500 || translation.x > view.frame.width / 3 {
// 向右速度够快或拖动距离够大,隐藏
hideWithAnimation()
} else {
// 保持显示
showWithAnimation()
}
}
default:
break
}
}
private func hideWithAnimation() {
isMessageListHidden = true
messageListStateButton.isSelected = true
UIView.animate(withDuration: 0.3,
delay: 0,
options: .curveEaseOut) {
self.messageListView.frame.origin.x = self.originalX + self.view.frame.width
self.topBarView.frame.origin.x = self.originalX + self.view.frame.width
self.bottomInputBar.frame.origin.x = self.originalX + self.view.frame.width
self.closeButton.isHidden = false
}
}
private func showWithAnimation() {
isMessageListHidden = false
messageListStateButton.isSelected = false
UIView.animate(withDuration: 0.3,
delay: 0,
options: .curveEaseOut) {
self.messageListView.frame.origin.x = self.originalX
self.topBarView.frame.origin.x = self.originalX
self.bottomInputBar.frame.origin.x = self.originalX
self.closeButton.isHidden = true
}
}
}
...@@ -23,7 +23,7 @@ class YHPlayerTopBarView: UIView { ...@@ -23,7 +23,7 @@ class YHPlayerTopBarView: UIView {
return view return view
}() }()
private lazy var headPortrait: UIImageView = { lazy var headPortrait: UIImageView = {
let view = UIImageView() let view = UIImageView()
view.layer.cornerRadius = headerWidth / 2.0 view.layer.cornerRadius = headerWidth / 2.0
view.clipsToBounds = true view.clipsToBounds = true
......
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "live_message_hide@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "live_message_hide@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "live_message_show@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "live_message_show@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment