Commit 24085dc4 authored by pete谢兆麟's avatar pete谢兆麟

Merge branch 'yinhe-live-1212' of...

Merge branch 'yinhe-live-1212' of http://gitlab.galaxy-immi.com/mobile-group/galaxy-iOS into yinhe-live-1212
parents 89c4bb06 0a544f2e
...@@ -7208,7 +7208,7 @@ ...@@ -7208,7 +7208,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxyTestEnv.entitlements; CODE_SIGN_ENTITLEMENTS = galaxy/galaxyTestEnv.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 15; CURRENT_PROJECT_VERSION = 16;
DEVELOPMENT_TEAM = RXHYW88XR7; DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
...@@ -7350,7 +7350,7 @@ ...@@ -7350,7 +7350,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxy.entitlements; CODE_SIGN_ENTITLEMENTS = galaxy/galaxy.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 15; CURRENT_PROJECT_VERSION = 16;
DEVELOPMENT_TEAM = RXHYW88XR7; DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
...@@ -7555,7 +7555,7 @@ ...@@ -7555,7 +7555,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxyDebug.entitlements; CODE_SIGN_ENTITLEMENTS = galaxy/galaxyDebug.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 15; CURRENT_PROJECT_VERSION = 16;
DEVELOPMENT_TEAM = RXHYW88XR7; DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
...@@ -7602,7 +7602,7 @@ ...@@ -7602,7 +7602,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxy.entitlements; CODE_SIGN_ENTITLEMENTS = galaxy/galaxy.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 15; CURRENT_PROJECT_VERSION = 16;
DEVELOPMENT_TEAM = RXHYW88XR7; DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
......
...@@ -114,26 +114,29 @@ class YHAIMainChatViewController: YHBaseViewController { ...@@ -114,26 +114,29 @@ class YHAIMainChatViewController: YHBaseViewController {
func reloadAndScrollToBottom(_ forceScrollToBottom: Bool = false, _ isNeedAccurate: Bool = false) { func reloadAndScrollToBottom(_ forceScrollToBottom: Bool = false, _ isNeedAccurate: Bool = false) {
self.tableView.reloadData() self.tableView.reloadData()
if !forceScrollToBottom && !canTriggerProgrammaticScroll() { if !forceScrollToBottom && !canTriggerProgrammaticScroll() {
return return
} }
DispatchQueue.main.asyncAfter(deadline: .now()+0.5) { DispatchQueue.main.async {
[weak self] in
guard let self = self else { return }
if isNeedAccurate { // 使用 UIView.animate 实现更丝滑的滚动效果
// self.tableView.setContentOffset(.zero, animated: true) UIView.animate(withDuration: 0.5,
// self.tableView.setContentOffset(CGPointMake(0, 90000), animated: true) delay: 0,
} usingSpringWithDamping: 1.0, // 弹簧阻尼,控制回弹效果
initialSpringVelocity: 0.3, // 初始速度
options: [.curveEaseOut, .allowUserInteraction],
// 使用 performBatchUpdates 来确保所有布局更新完成后再滚动 animations: {
self.tableView.performBatchUpdates(nil) { _ in
// 在布局更新完成后执行滚动
if self.messages.count > 0 { if self.messages.count > 0 {
let lastIndexPath = IndexPath(row: self.messages.count-1, section: 0) let lastIndexPath = IndexPath(row: self.messages.count-1, section: 0)
self.tableView.scrollToRow(at: lastIndexPath, at: .bottom, animated: true) self.tableView.scrollToRow(at: lastIndexPath, at: .bottom, animated: false)
} }
}
}, completion: nil)
} }
} }
...@@ -148,21 +151,16 @@ class YHAIMainChatViewController: YHBaseViewController { ...@@ -148,21 +151,16 @@ class YHAIMainChatViewController: YHBaseViewController {
self.reloadAndScrollToBottom(forceScrollToBottom) self.reloadAndScrollToBottom(forceScrollToBottom)
self.bottomInputView.status = .loading self.bottomInputView.status = .loading
self.chatConfig.disableHandleMessage = false self.chatConfig.disableHandleMessage = false
self.manager.disableHandleMessage = false
self.manager.requestAI(botId: self.robotId, conversationId: self.conversationId, question:text) { self.manager.requestAI(botId: self.robotId, conversationId: self.conversationId, question:text) {
[weak self] res, done in [weak self] res, done in
guard let self = self else { return } guard let self = self else { return }
self.chatConfig.handleReceiveMessage(res, done, &messages)
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { if done {
[weak self] in print("RESPONSE-DONE")
guard let self = self else { return } self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
self.chatConfig.handleReceiveMessage(res, done, &messages)
if done {
print("RESPONSE-DONE")
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
}
self.reloadAndScrollToBottom(forceScrollToBottom)
} }
self.reloadAndScrollToBottom(forceScrollToBottom)
} }
} }
} }
...@@ -202,19 +200,15 @@ class YHAIMainChatViewController: YHBaseViewController { ...@@ -202,19 +200,15 @@ class YHAIMainChatViewController: YHBaseViewController {
} }
func stopAutoResponse(completion:((Bool)->())? = nil) { func stopAutoResponse(completion:((Bool)->())? = nil) {
self.manager.cancelCurrentRequest()
self.reloadAndScrollToBottom()
self.chatConfig.disableHandleMessage = true
self.manager.disableHandleMessage = true
self.chatConfig.removeThinkingMessageFromChatList(&self.messages)
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
completion?(true)
self.manager.stopChat(chatId: self.manager.chatId, conversationId: self.conversationId) { success, error in self.manager.stopChat(chatId: self.manager.chatId, conversationId: self.conversationId) { success, error in
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
if success {
self.reloadAndScrollToBottom()
self.manager.request?.cancel()
self.chatConfig.disableHandleMessage = true
DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
self.chatConfig.removeThinkingMessageFromChatList(&self.messages)
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
self.tableView.reloadData()
completion?(success)
}
}
} }
} }
...@@ -272,9 +266,7 @@ extension YHAIMainChatViewController: UITableViewDelegate, UITableViewDataSource ...@@ -272,9 +266,7 @@ extension YHAIMainChatViewController: UITableViewDelegate, UITableViewDataSource
guard let self = self else { return } guard let self = self else { return }
if self.isNeedStopResonse() { if self.isNeedStopResonse() {
self.stopAutoResponse { success in self.stopAutoResponse { success in
if success { self.sendMessage(text)
self.sendMessage(text)
}
} }
} else { } else {
self.sendMessage(text) self.sendMessage(text)
...@@ -354,6 +346,47 @@ extension YHAIMainChatViewController: UITableViewDelegate, UITableViewDataSource ...@@ -354,6 +346,47 @@ extension YHAIMainChatViewController: UITableViewDelegate, UITableViewDataSource
} }
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if 0 <= indexPath.row, indexPath.row < messages.count {
let message = messages[indexPath.row]
let msgType = message.getType()
if !message.isTextMessage() {
return UITableView.automaticDimension
}
let text = message.body.contentText // 要显示的文本内容
let font = UIFont.PFSC_R(ofSize: 14) // 字体大小
let maxWidth = KScreenWidth-20*2-16*2 // 最大宽度限制
let attributes = [NSAttributedString.Key.font : font] as [NSAttributedString.Key : Any]
let size = (text as NSString).boundingRect(with: CGSize(width: maxWidth, height: .greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: attributes, context: nil).size
var textHeight = ceil(size.height)
if textHeight < 20.0 {
textHeight = 20.0
}
if message.isSelf || msgType == .recommendText {
return textHeight + 16.0*2 + 16.0
}
let complete = message.isDone
let isNeedShowCopyView = complete
let isNeedShowLoadingView = !complete
var resultHeight = textHeight+16.0*2.0
if isNeedShowLoadingView {
resultHeight += (18+6)
}
if isNeedShowCopyView {
resultHeight += (16+37)
} else {
resultHeight += 16
}
return resultHeight
}
return UITableView.automaticDimension return UITableView.automaticDimension
} }
......
...@@ -27,6 +27,9 @@ class YHAIRequestManager: NSObject { ...@@ -27,6 +27,9 @@ class YHAIRequestManager: NSObject {
var uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description var uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
var chatId = "" var chatId = ""
var disableHandleMessage: Bool = false
func getCommonHeaders() -> HTTPHeaders { func getCommonHeaders() -> HTTPHeaders {
var requestHeader = HTTPHeaders() var requestHeader = HTTPHeaders()
...@@ -58,10 +61,19 @@ class YHAIRequestManager: NSObject { ...@@ -58,10 +61,19 @@ class YHAIRequestManager: NSObject {
} }
return requestHeader return requestHeader
} }
func cancelCurrentRequest() {
self.request?.responseStreamString {
stream in
}
self.request?.cancel()
self.request = nil
}
func requestAI(botId: String, conversationId: String, question: String = "", callback: ((_ msg: YHAIChatMessage?, _ done: Bool) -> Void)?) { func requestAI(botId: String, conversationId: String, question: String = "", callback: ((_ msg: YHAIChatMessage?, _ done: Bool) -> Void)?) {
self.disableHandleMessage = false
let url = YHBaseUrlManager.shared.curURL() + YHAllApiName.AIChat.agentChat let url = YHBaseUrlManager.shared.curURL() + YHAllApiName.AIChat.agentChat
self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
...@@ -86,6 +98,10 @@ class YHAIRequestManager: NSObject { ...@@ -86,6 +98,10 @@ class YHAIRequestManager: NSObject {
[weak self] stream in [weak self] stream in
guard let self = self else { return } guard let self = self else { return }
if self.disableHandleMessage {
return
}
switch stream.event { switch stream.event {
case let .stream(result): case let .stream(result):
...@@ -100,15 +116,15 @@ class YHAIRequestManager: NSObject { ...@@ -100,15 +116,15 @@ class YHAIRequestManager: NSObject {
case let .failure(error): case let .failure(error):
print("\(error)") print("\(error)")
// 一段话结束需要重新生成uuid 来 // 一段话结束需要重新生成uuid 来
self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description // self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
callback?(nil, true) // callback?(nil, true)
} }
case let .complete(completion): case let .complete(completion):
print("COMPLETE") print("COMPLETE")
// 一段话结束需要重新生成uuid 来 // 一段话结束需要重新生成uuid 来
self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description // self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
callback?(nil, true) // callback?(nil, true)
if let af_error = completion.error { if let af_error = completion.error {
...@@ -166,7 +182,7 @@ class YHAIRequestManager: NSObject { ...@@ -166,7 +182,7 @@ class YHAIRequestManager: NSObject {
} }
// 处理data字符串 // 处理data字符串
func handle(dataString: String, completion:((_ : YHAIChatMessage, _ done: Bool) ->())?) { func handle(dataString: String, completion:((_ : YHAIChatMessage?, _ done: Bool) ->())?) {
let arr = dataString.components(separatedBy: "\n\n") let arr = dataString.components(separatedBy: "\n\n")
if arr.count <= 0 { if arr.count <= 0 {
...@@ -229,36 +245,40 @@ class YHAIRequestManager: NSObject { ...@@ -229,36 +245,40 @@ class YHAIRequestManager: NSObject {
self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description self.uuid = UUID().uuidString + NSDate().timeIntervalSince1970.description
} }
// if receiveMessage.isUserfulMessage() {
// completion?(receiveMessage, sessionDone)
// }
if receiveMessage.isUserfulMessage() { if receiveMessage.isUserfulMessage() {
if receiveMessage.isNeedSpiceMessage() { if receiveMessage.body.isDone() {
let text = receiveMessage.body.contentText completion?(nil, sessionDone)
if text.count > 1 {
let textArray = Array(text)
for (index, character) in textArray.enumerated() {
let msg = receiveMessage.copy() as! YHAIChatMessage
msg.body.contentText = String(character)
msg.body.status = ""
if index == textArray.count-1 {
msg.body.status = receiveMessage.body.status
}
msg.updateBodyToData()
printLog("AAAAA- \(msg)")
sessionDone = receiveMessage.body.isDone()
completion?(msg, sessionDone)
}
} else {
completion?(receiveMessage, sessionDone)
}
} else { } else {
completion?(receiveMessage, sessionDone) completion?(receiveMessage, sessionDone)
} }
} }
// if receiveMessage.isUserfulMessage() {
// if receiveMessage.isNeedSpiceMessage() {
// let text = receiveMessage.body.contentText
// if text.count > 1 {
// let textArray = Array(text)
// for (index, character) in textArray.enumerated() {
// let msg = receiveMessage.copy() as! YHAIChatMessage
// msg.body.contentText = String(character)
// msg.body.status = ""
// if index == textArray.count-1 {
// msg.body.status = receiveMessage.body.status
// }
// msg.updateBodyToData()
// printLog("AAAAA- \(msg)")
// sessionDone = receiveMessage.body.isDone()
// completion?(msg, sessionDone)
// }
//
// } else {
// completion?(receiveMessage, sessionDone)
// }
//
// } else {
// completion?(receiveMessage, sessionDone)
// }
// }
} }
} // arr 结束 } // arr 结束
} }
......
...@@ -31,7 +31,6 @@ class YHAIRobotChatViewController: YHBaseViewController { ...@@ -31,7 +31,6 @@ class YHAIRobotChatViewController: YHBaseViewController {
}() }()
lazy var tableView: UITableView = { lazy var tableView: UITableView = {
let tableView = UITableView(frame: CGRectMake(0, 0, k_Height_NavigationtBarAndStatuBar, KScreenHeight-k_Height_NavigationtBarAndStatuBar-64-k_Height_safeAreaInsetsBottom()), style:.grouped) let tableView = UITableView(frame: CGRectMake(0, 0, k_Height_NavigationtBarAndStatuBar, KScreenHeight-k_Height_NavigationtBarAndStatuBar-64-k_Height_safeAreaInsetsBottom()), style:.grouped)
if #available(iOS 11.0, *) { if #available(iOS 11.0, *) {
...@@ -47,7 +46,7 @@ class YHAIRobotChatViewController: YHBaseViewController { ...@@ -47,7 +46,7 @@ class YHAIRobotChatViewController: YHBaseViewController {
chatConfig.registerMessageGroupCells(tableView) chatConfig.registerMessageGroupCells(tableView)
return tableView return tableView
}() }()
lazy var bgImgView: UIImageView = { lazy var bgImgView: UIImageView = {
let v = UIImageView(image: UIImage(named: "ai_chat_bg")) let v = UIImageView(image: UIImage(named: "ai_chat_bg"))
return v return v
...@@ -94,9 +93,7 @@ class YHAIRobotChatViewController: YHBaseViewController { ...@@ -94,9 +93,7 @@ class YHAIRobotChatViewController: YHBaseViewController {
guard let self = self else { return } guard let self = self else { return }
if self.isNeedStopResonse() { if self.isNeedStopResonse() {
self.stopAutoResponse { success in self.stopAutoResponse { success in
if success { self.sendMessage(text, true)
self.sendMessage(text, true)
}
} }
} else { } else {
self.sendMessage(text, true) self.sendMessage(text, true)
...@@ -115,9 +112,7 @@ class YHAIRobotChatViewController: YHBaseViewController { ...@@ -115,9 +112,7 @@ class YHAIRobotChatViewController: YHBaseViewController {
if self.isNeedStopResonse() { if self.isNeedStopResonse() {
self.stopAutoResponse { success in self.stopAutoResponse { success in
if success { self.sendMessage(text, true)
self.sendMessage(text, true)
}
} }
} else { } else {
self.sendMessage(text, true) self.sendMessage(text, true)
...@@ -189,25 +184,29 @@ class YHAIRobotChatViewController: YHBaseViewController { ...@@ -189,25 +184,29 @@ class YHAIRobotChatViewController: YHBaseViewController {
func reloadAndScrollToBottom(_ forceScrollToBottom: Bool = false, _ isNeedAccurate: Bool = false) { func reloadAndScrollToBottom(_ forceScrollToBottom: Bool = false, _ isNeedAccurate: Bool = false) {
self.tableView.reloadData() self.tableView.reloadData()
if !forceScrollToBottom && !canTriggerProgrammaticScroll() { if !forceScrollToBottom && !canTriggerProgrammaticScroll() {
return return
} }
DispatchQueue.main.asyncAfter(deadline: .now()+0.5) { DispatchQueue.main.async {
[weak self] in
guard let self = self else { return }
if isNeedAccurate { // 使用 UIView.animate 实现更丝滑的滚动效果
// self.tableView.setContentOffset(.zero, animated: true) UIView.animate(withDuration: 0.5,
// self.tableView.setContentOffset(CGPointMake(0, 90000), animated: true) delay: 0,
} usingSpringWithDamping: 1.0, // 弹簧阻尼,控制回弹效果
initialSpringVelocity: 0.3, // 初始速度
// 使用 performBatchUpdates 来确保所有布局更新完成后再滚动 options: [.curveEaseOut, .allowUserInteraction],
self.tableView.performBatchUpdates(nil) { _ in animations: {
// 在布局更新完成后执行滚动
if self.messages.count > 0 { if self.messages.count > 0 {
let lastIndexPath = IndexPath(row: self.messages.count-1, section: 0) let lastIndexPath = IndexPath(row: self.messages.count-1, section: 0)
self.tableView.scrollToRow(at: lastIndexPath, at: .bottom, animated: true) self.tableView.scrollToRow(at: lastIndexPath, at: .bottom, animated: false)
} }
}
}, completion: nil)
} }
} }
...@@ -219,22 +218,18 @@ class YHAIRobotChatViewController: YHBaseViewController { ...@@ -219,22 +218,18 @@ class YHAIRobotChatViewController: YHBaseViewController {
messages.append(thinkingMessage) messages.append(thinkingMessage)
self.bottomInputView.status = .loading self.bottomInputView.status = .loading
self.chatConfig.disableHandleMessage = false self.chatConfig.disableHandleMessage = false
self.manager.disableHandleMessage = false
self.reloadAndScrollToBottom(forceScrollToBottom) self.reloadAndScrollToBottom(forceScrollToBottom)
self.manager.requestAI(botId: self.robotId, conversationId: self.conversationId, question:text) { self.manager.requestAI(botId: self.robotId, conversationId: self.conversationId, question:text) {
[weak self] res, done in [weak self] res, done in
guard let self = self else { return } guard let self = self else { return }
self.chatConfig.handleReceiveMessage(res, done, &messages)
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { if done {
[weak self] in print("RESPONSE-DONE")
guard let self = self else { return } self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
self.chatConfig.handleReceiveMessage(res, done, &messages)
if done {
print("RESPONSE-DONE")
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
}
self.reloadAndScrollToBottom(forceScrollToBottom)
} }
self.reloadAndScrollToBottom(forceScrollToBottom)
} }
} }
...@@ -292,19 +287,15 @@ class YHAIRobotChatViewController: YHBaseViewController { ...@@ -292,19 +287,15 @@ class YHAIRobotChatViewController: YHBaseViewController {
} }
func stopAutoResponse(completion:((Bool)->())? = nil) { func stopAutoResponse(completion:((Bool)->())? = nil) {
self.manager.cancelCurrentRequest()
self.reloadAndScrollToBottom()
self.chatConfig.disableHandleMessage = true
self.manager.disableHandleMessage = true
self.chatConfig.removeThinkingMessageFromChatList(&self.messages)
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
completion?(true)
self.manager.stopChat(chatId: self.manager.chatId, conversationId: self.conversationId) { success, error in self.manager.stopChat(chatId: self.manager.chatId, conversationId: self.conversationId) { success, error in
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
if success {
self.reloadAndScrollToBottom()
self.manager.request?.cancel()
self.chatConfig.disableHandleMessage = true
DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
self.chatConfig.removeThinkingMessageFromChatList(&self.messages)
self.bottomInputView.status = self.bottomInputView.textView.text.isEmpty ? .disableSend : .enableSend
self.tableView.reloadData()
completion?(success)
}
}
} }
} }
...@@ -415,9 +406,7 @@ extension YHAIRobotChatViewController: UITableViewDelegate, UITableViewDataSourc ...@@ -415,9 +406,7 @@ extension YHAIRobotChatViewController: UITableViewDelegate, UITableViewDataSourc
if self.isNeedStopResonse() { if self.isNeedStopResonse() {
self.stopAutoResponse { success in self.stopAutoResponse { success in
if success { self.sendMessage(text, true)
self.sendMessage(text, true)
}
} }
} else { } else {
self.sendMessage(text, true) self.sendMessage(text, true)
...@@ -497,6 +486,47 @@ extension YHAIRobotChatViewController: UITableViewDelegate, UITableViewDataSourc ...@@ -497,6 +486,47 @@ extension YHAIRobotChatViewController: UITableViewDelegate, UITableViewDataSourc
} }
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if 0 <= indexPath.row, indexPath.row < messages.count {
let message = messages[indexPath.row]
let msgType = message.getType()
if !message.isTextMessage() {
return UITableView.automaticDimension
}
let text = message.body.contentText // 要显示的文本内容
let font = UIFont.PFSC_R(ofSize: 14) // 字体大小
let maxWidth = KScreenWidth-20*2-16*2 // 最大宽度限制
let attributes = [NSAttributedString.Key.font : font] as [NSAttributedString.Key : Any]
let size = (text as NSString).boundingRect(with: CGSize(width: maxWidth, height: .greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: attributes, context: nil).size
var textHeight = ceil(size.height)
if textHeight < 20.0 {
textHeight = 20.0
}
if message.isSelf || msgType == .recommendText {
return textHeight + 16.0*2 + 16.0
}
let complete = message.isDone
let isNeedShowCopyView = complete
let isNeedShowLoadingView = !complete
var resultHeight = textHeight+16.0*2.0
if isNeedShowLoadingView {
resultHeight += (18+6)
}
if isNeedShowCopyView {
resultHeight += (16+37)
} else {
resultHeight += 16
}
return resultHeight
}
return UITableView.automaticDimension return UITableView.automaticDimension
} }
......
...@@ -154,7 +154,7 @@ class YHAIChatMessage: CustomStringConvertible, NSCopying { ...@@ -154,7 +154,7 @@ class YHAIChatMessage: CustomStringConvertible, NSCopying {
// //
func isUserfulMessage() -> Bool { func isUserfulMessage() -> Bool {
if !self.body.isStart() && !self.body.isDone() { if !self.body.isStart() {
return true return true
} }
return false return false
......
...@@ -30,7 +30,7 @@ class YHAITextMessageCell: UITableViewCell { ...@@ -30,7 +30,7 @@ class YHAITextMessageCell: UITableViewCell {
whiteContentView.snp.remakeConstraints { make in whiteContentView.snp.remakeConstraints { make in
make.left.greaterThanOrEqualTo(20) make.left.greaterThanOrEqualTo(20)
make.right.equalTo(-20) make.right.equalTo(-20)
make.top.equalTo(20) make.top.equalTo(16)
make.bottom.equalTo(0) make.bottom.equalTo(0)
} }
...@@ -46,11 +46,6 @@ class YHAITextMessageCell: UITableViewCell { ...@@ -46,11 +46,6 @@ class YHAITextMessageCell: UITableViewCell {
} else { } else {
messageLabel.text = message.body.contentText messageLabel.text = message.body.contentText
// let text = message.body.contentText
// if text.count >= message.body.contentTextIndex {
// messageLabel.text = String(text.prefix(message.body.contentTextIndex))
// }
whiteContentView.backgroundColor = .white whiteContentView.backgroundColor = .white
messageLabel.textColor = .mainTextColor messageLabel.textColor = .mainTextColor
...@@ -58,7 +53,7 @@ class YHAITextMessageCell: UITableViewCell { ...@@ -58,7 +53,7 @@ class YHAITextMessageCell: UITableViewCell {
whiteContentView.snp.remakeConstraints { make in whiteContentView.snp.remakeConstraints { make in
make.left.equalTo(20) make.left.equalTo(20)
make.right.equalTo(-20) make.right.equalTo(-20)
make.top.equalTo(20) make.top.equalTo(16)
make.bottom.equalTo(0) make.bottom.equalTo(0)
} }
......
...@@ -136,7 +136,7 @@ private extension YHHomePageViewController { ...@@ -136,7 +136,7 @@ private extension YHHomePageViewController {
if liveInfo.status == 1 { if liveInfo.status == 1 {
let playbackInfo = YHPlayerManager.PlaybackInfo(id: liveInfo.id, token: liveInfo.token, channelId: liveInfo.rtmp_channel, uid: UInt(liveInfo.user_id), isLive: true, scene: .floating, playerType: .main) let playbackInfo = YHPlayerManager.PlaybackInfo(id: liveInfo.id, token: liveInfo.token, channelId: liveInfo.rtmp_channel, uid: UInt(liveInfo.user_id), isLive: true, scene: .floating, playerType: .main)
YHPlayerManager.shared.enterFloating(from: nil, playbackInfo: playbackInfo, isConfigured: true) YHPlayerManager.shared.enterFloating(from: nil, playbackInfo: playbackInfo, isConfigured: true)
} else { } else if YHPlayerManager.shared.floatingWindow?.source == .configured {
YHPlayerManager.shared.exitFloating() YHPlayerManager.shared.exitFloating()
} }
} }
......
...@@ -24,17 +24,19 @@ class YHHomeBannerView: UIView { ...@@ -24,17 +24,19 @@ class YHHomeBannerView: UIView {
self.indicatorView.curIndicatorIndex = 0 self.indicatorView.curIndicatorIndex = 0
// 指定显示图片为第一个 // 指定显示图片为第一个
bannerView.selectItem(at: 0, animated: false) bannerView.selectItem(at: 0, animated: false)
if let index = dataArr.firstIndex(where: { // 开启定时器开始滚动
$0.skip_type == 100 bannerView.automaticSlidingInterval = bannerSildingInterval
}) { // if let index = dataArr.firstIndex(where: {
// 开启定时器开始滚动 // $0.skip_type == 100
bannerView.automaticSlidingInterval = 0 // }) {
bannerView.scrollToItem(at: index, animated: false) // // 开启定时器开始滚动
indicatorView.curIndicatorIndex = index // bannerView.automaticSlidingInterval = 0
} else { // bannerView.scrollToItem(at: index, animated: false)
// 开启定时器开始滚动 // indicatorView.curIndicatorIndex = index
bannerView.automaticSlidingInterval = bannerSildingInterval // } else {
} // // 开启定时器开始滚动
// bannerView.automaticSlidingInterval = bannerSildingInterval
// }
bannerView.removesInfiniteLoopForSingleItem = true bannerView.removesInfiniteLoopForSingleItem = true
bannerView.alwaysBounceHorizontal = true bannerView.alwaysBounceHorizontal = true
} }
...@@ -244,10 +246,10 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate { ...@@ -244,10 +246,10 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
return return
} }
let cell: YHHomeBannerCollectionViewCell? = pagerView.cellForItem(at: index) as? YHHomeBannerCollectionViewCell let cell: YHHomeBannerCollectionViewCell? = pagerView.cellForItem(at: index) as? YHHomeBannerCollectionViewCell
if let player = YHPlayerManager.shared.getPlayer(.secondary) { // if let player = YHPlayerManager.shared.getPlayer(.secondary) {
YHPlayerManager.shared.leaveChannel(for: player) // YHPlayerManager.shared.leaveChannel(for: player)
player.clearPlayerView() // player.clearPlayerView()
} // }
let playbackInfo = YHPlayerManager.PlaybackInfo(id: model.live_id, url: nil, title: nil, roomId: nil, token: model.token, channelId: model.rtmp_channel, uid: model.user_id != 0 ? UInt(model.user_id) : nil, isLive: true, scene: .fullscreen) let playbackInfo = YHPlayerManager.PlaybackInfo(id: model.live_id, url: nil, title: nil, roomId: nil, token: model.token, channelId: model.rtmp_channel, uid: model.user_id != 0 ? UInt(model.user_id) : nil, isLive: true, scene: .fullscreen)
YHPlayerManager.shared.enterLive(from: cell?.bannerImagV, playbackInfo: playbackInfo) YHPlayerManager.shared.enterLive(from: cell?.bannerImagV, playbackInfo: playbackInfo)
printLog("跳转直播") printLog("跳转直播")
...@@ -268,10 +270,10 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate { ...@@ -268,10 +270,10 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
if !checkLogin() { if !checkLogin() {
return return
} }
if let player = YHPlayerManager.shared.getPlayer(.secondary) { // if let player = YHPlayerManager.shared.getPlayer(.secondary) {
YHPlayerManager.shared.leaveChannel(for: player) // YHPlayerManager.shared.leaveChannel(for: player)
player.clearPlayerView() // player.clearPlayerView()
} // }
let cell: YHHomeBannerCollectionViewCell? = pagerView.cellForItem(at: index) as? YHHomeBannerCollectionViewCell let cell: YHHomeBannerCollectionViewCell? = pagerView.cellForItem(at: index) as? YHHomeBannerCollectionViewCell
let playbackInfo = YHPlayerManager.PlaybackInfo(id: model.live_id, url: model.live_pull_url, title: nil, roomId: nil, token: model.token, channelId: model.rtmp_channel, uid: UInt(model.user_id), isLive: true, scene: .fullscreen) let playbackInfo = YHPlayerManager.PlaybackInfo(id: model.live_id, url: model.live_pull_url, title: nil, roomId: nil, token: model.token, channelId: model.rtmp_channel, uid: UInt(model.user_id), isLive: true, scene: .fullscreen)
YHPlayerManager.shared.enterLive(from: cell?.bannerImagV, playbackInfo: playbackInfo) YHPlayerManager.shared.enterLive(from: cell?.bannerImagV, playbackInfo: playbackInfo)
...@@ -291,7 +293,7 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate { ...@@ -291,7 +293,7 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
func pagerViewDidEndScrollAnimation(_ pagerView: FSPagerView) { func pagerViewDidEndScrollAnimation(_ pagerView: FSPagerView) {
self.indicatorView.curIndicatorIndex = pagerView.currentIndex self.indicatorView.curIndicatorIndex = pagerView.currentIndex
} }
/*
func pagerView(_ pagerView: FSPagerView, willDisplay cell: FSPagerViewCell, forItemAt index: Int) { func pagerView(_ pagerView: FSPagerView, willDisplay cell: FSPagerViewCell, forItemAt index: Int) {
if index >= dataArr.count { if index >= dataArr.count {
...@@ -333,4 +335,5 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate { ...@@ -333,4 +335,5 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
} }
} }
} }
*/
} }
...@@ -630,10 +630,10 @@ extension YHJsApi { ...@@ -630,10 +630,10 @@ extension YHJsApi {
return return
} }
if type == 1 { if type == 1 {
let playbackInfo = YHPlayerManager.PlaybackInfo(id: id.intValue(), isLive: true) let playbackInfo = YHPlayerManager.PlaybackInfo(id: id.intValue(), isLive: true, isFromSaleDetail: true)
YHPlayerManager.shared.enterLive(from: nil, playbackInfo: playbackInfo) YHPlayerManager.shared.enterLive(from: nil, playbackInfo: playbackInfo)
} else if type == 2 { } else if type == 2 {
let playbackInfo = YHPlayerManager.PlaybackInfo(id: id.intValue(), isLive: false, needHideZoomButton: true) let playbackInfo = YHPlayerManager.PlaybackInfo(id: id.intValue(), isLive: false, isFromSaleDetail: true)
YHPlayerManager.shared.enterVOD(from: nil, playbackInfo: playbackInfo) YHPlayerManager.shared.enterVOD(from: nil, playbackInfo: playbackInfo)
} }
......
...@@ -27,6 +27,7 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -27,6 +27,7 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
private var isFirstAppear = true private var isFirstAppear = true
private var timer: DispatchSourceTimer? private var timer: DispatchSourceTimer?
private var isDisappearFromZoom = false private var isDisappearFromZoom = false
private let timeCount: Int = 120
// MARK: - UI Components // MARK: - UI Components
...@@ -182,9 +183,20 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -182,9 +183,20 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
} }
topBarView.zoomButtonClickEvent = { [weak self] in topBarView.zoomButtonClickEvent = { [weak self] in
self?.isDisappearFromZoom = true if let playbackInfo = self?.playbackInfo, playbackInfo.isFromSaleDetail {
self?.leaveLiveRoom() self?.clearInfo()
self?.enterFloating() if let nav = self?.navigationController, nav.viewControllers.count > 1 {
nav.popViewController(animated: true)
} else {
self?.dismiss(animated: true)
}
} else {
self?.isDisappearFromZoom = true
self?.quitChatRoom()
self?.leaveLiveRoom()
// self?.clearInfo()
self?.enterFloating()
}
} }
topBarView.shareButtonClickEvent = { [weak self] in topBarView.shareButtonClickEvent = { [weak self] in
...@@ -315,11 +327,11 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -315,11 +327,11 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
// MARK: - Public Methods // MARK: - Public Methods
func play(url: String, title: String? = nil) { // func play(url: String, title: String? = nil) {
currentPlayingURL = url // currentPlayingURL = url
currentVideoTitle = title // currentVideoTitle = title
YHPlayerManager.shared.play(url: url, inView: playerView, title: title) // YHPlayerManager.shared.play(url: url, inView: playerView, title: title)
} // }
func enterFloating() { func enterFloating() {
guard let playbackInfo = playbackInfo else { guard let playbackInfo = playbackInfo else {
...@@ -377,15 +389,23 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -377,15 +389,23 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
} }
} }
} }
private func closeLive() { private func clearInfo() {
quitChatRoom() quitChatRoom()
leaveLiveRoom() leaveLiveRoom()
// YHPlayerManager.shared.stop(type: .main) // YHPlayerManager.shared.stop(type: .main)
if let player = player { if let player = player {
YHPlayerManager.shared.leaveChannel(for: player) YHPlayerManager.shared.leaveChannel(for: player)
} }
dismiss(animated: true) }
private func closeLive() {
clearInfo()
if let nav = navigationController, nav.viewControllers.count > 1 {
nav.popViewController(animated: true)
} else {
dismiss(animated: true)
}
} }
private func shareLive() { private func shareLive() {
...@@ -618,7 +638,7 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -618,7 +638,7 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
/// 设置定时器 /// 设置定时器
private func setupTimer() { private func setupTimer() {
timer = DispatchSource.makeTimerSource(queue: .main) timer = DispatchSource.makeTimerSource(queue: .main)
timer?.schedule(deadline: .now(), repeating: .seconds(120)) timer?.schedule(deadline: .now(), repeating: .seconds(timeCount))
timer?.setEventHandler(handler: { [weak self] in timer?.setEventHandler(handler: { [weak self] in
guard let self = self else { guard let self = self else {
return return
......
...@@ -31,7 +31,7 @@ class YHPlayerManager: NSObject { ...@@ -31,7 +31,7 @@ class YHPlayerManager: NSObject {
let isLive: Bool let isLive: Bool
var scene: PlaybackScene var scene: PlaybackScene
var playerType: YHPlayerType var playerType: YHPlayerType
var needHideZoomButton: Bool = false var isFromSaleDetail: Bool = false
init(id: Int, init(id: Int,
url: String? = nil, url: String? = nil,
...@@ -43,7 +43,7 @@ class YHPlayerManager: NSObject { ...@@ -43,7 +43,7 @@ class YHPlayerManager: NSObject {
isLive: Bool, isLive: Bool,
scene: PlaybackScene = .fullscreen, scene: PlaybackScene = .fullscreen,
playerType: YHPlayerType = .main, playerType: YHPlayerType = .main,
needHideZoomButton: Bool = false) { isFromSaleDetail: Bool = false) {
self.id = id self.id = id
self.url = url self.url = url
self.title = title self.title = title
...@@ -54,7 +54,7 @@ class YHPlayerManager: NSObject { ...@@ -54,7 +54,7 @@ class YHPlayerManager: NSObject {
self.isLive = isLive self.isLive = isLive
self.scene = scene self.scene = scene
self.playerType = playerType self.playerType = playerType
self.needHideZoomButton = needHideZoomButton self.isFromSaleDetail = isFromSaleDetail
} }
static func == (lhs: Self, rhs: Self) -> Bool { static func == (lhs: Self, rhs: Self) -> Bool {
...@@ -71,7 +71,7 @@ class YHPlayerManager: NSObject { ...@@ -71,7 +71,7 @@ class YHPlayerManager: NSObject {
private var secondaryChannelDelegate: YHSecondaryChannelDelegate? private var secondaryChannelDelegate: YHSecondaryChannelDelegate?
private var activePlayers: [YHPlayerType: YHPlayer] = [:] private var activePlayers: [YHPlayerType: YHPlayer] = [:]
private var currentPlaybackInfo: [YHPlayerType: PlaybackInfo] = [:] private var currentPlaybackInfo: [YHPlayerType: PlaybackInfo] = [:]
private var floatingWindow: YHFloatingWindow? private(set) var floatingWindow: YHFloatingWindow?
private(set) var isInRecommendPage: Bool = false private(set) var isInRecommendPage: Bool = false
private(set) var isConfigFloating: Bool? = nil private(set) var isConfigFloating: Bool? = nil
private var bannerAutoPlayEnabled: Bool = true private var bannerAutoPlayEnabled: Bool = true
...@@ -145,7 +145,7 @@ class YHPlayerManager: NSObject { ...@@ -145,7 +145,7 @@ class YHPlayerManager: NSObject {
activePlayers.forEach { $0.value.stop() } activePlayers.forEach { $0.value.stop() }
// 释放副播放器 // 释放副播放器
releasePlayer(.secondary) //releasePlayer(.secondary)
// 清理播放信息 // 清理播放信息
currentPlaybackInfo.removeAll() currentPlaybackInfo.removeAll()
...@@ -302,14 +302,14 @@ class YHPlayerManager: NSObject { ...@@ -302,14 +302,14 @@ class YHPlayerManager: NSObject {
// 如果是从banner跳转,需要转移播放进度 // 如果是从banner跳转,需要转移播放进度
var startPosition: Int = 0 var startPosition: Int = 0
if let bannerPlayer = activePlayers[.secondary] { // if let bannerPlayer = activePlayers[.secondary] {
startPosition = bannerPlayer.getPosition() // startPosition = bannerPlayer.getPosition()
if bannerPlayer.playMode == .live { // if bannerPlayer.playMode == .live {
leaveChannel(for: bannerPlayer) // leaveChannel(for: bannerPlayer)
} else { // } else {
bannerPlayer.pause() // bannerPlayer.pause()
} // }
} // }
var lastVodVC: YHVODPlayerViewController? var lastVodVC: YHVODPlayerViewController?
var lastNav: UINavigationController? var lastNav: UINavigationController?
var lastLiveVC: YHLivePlayerViewController? var lastLiveVC: YHLivePlayerViewController?
...@@ -372,13 +372,13 @@ class YHPlayerManager: NSObject { ...@@ -372,13 +372,13 @@ class YHPlayerManager: NSObject {
updatedInfo.playerType = playerType updatedInfo.playerType = playerType
// 如果是从banner跳转,需要转移播放进度 // 如果是从banner跳转,需要转移播放进度
if let bannerPlayer = activePlayers[.secondary] { // if let bannerPlayer = activePlayers[.secondary] {
if bannerPlayer.playMode == .live { // if bannerPlayer.playMode == .live {
leaveChannel(for: bannerPlayer) // leaveChannel(for: bannerPlayer)
} else { // } else {
bannerPlayer.pause() // bannerPlayer.pause()
} // }
} // }
var lastVodVC: YHVODPlayerViewController? var lastVodVC: YHVODPlayerViewController?
var lastNav: UINavigationController? var lastNav: UINavigationController?
var lastLiveVC: YHLivePlayerViewController? var lastLiveVC: YHLivePlayerViewController?
...@@ -471,13 +471,13 @@ class YHPlayerManager: NSObject { ...@@ -471,13 +471,13 @@ class YHPlayerManager: NSObject {
} }
// 如果是从banner跳转,需要转移播放进度 // 如果是从banner跳转,需要转移播放进度
if let bannerPlayer = activePlayers[.secondary] { // if let bannerPlayer = activePlayers[.secondary] {
if bannerPlayer.playMode == .live { // if bannerPlayer.playMode == .live {
leaveChannel(for: bannerPlayer) // leaveChannel(for: bannerPlayer)
} else { // } else {
bannerPlayer.pause() // bannerPlayer.pause()
} // }
} // }
let playerType = determinePlayerType(for: .floating) let playerType = determinePlayerType(for: .floating)
let player: YHPlayer = player(for: playerType) let player: YHPlayer = player(for: playerType)
...@@ -781,20 +781,20 @@ extension YHPlayerManager { ...@@ -781,20 +781,20 @@ extension YHPlayerManager {
if isRecommendPage { if isRecommendPage {
if isConfigFloating == true { if isConfigFloating == true {
if let window = floatingWindow, let player = window.player, window.source == .configured { if let window = floatingWindow, let player = window.player, window.source == .configured {
stopBannerPlayback() //stopBannerPlayback()
resumeConfiguredFloatingWindow(window, player) resumeConfiguredFloatingWindow(window, player)
} }
} else { } else {
if let window = floatingWindow, window.source == .configured { if let window = floatingWindow, window.source == .configured {
exitFloating() exitFloating()
} }
enableBannerAutoPlay() //enableBannerAutoPlay()
} }
} else { } else {
if let window = floatingWindow, window.source == .configured { if let window = floatingWindow, window.source == .configured {
exitFloating() exitFloating()
} }
stopBannerPlayback() //stopBannerPlayback()
} }
} }
...@@ -828,45 +828,45 @@ extension YHPlayerManager { ...@@ -828,45 +828,45 @@ extension YHPlayerManager {
} }
} }
private func stopBannerPlayback() { // private func stopBannerPlayback() {
bannerAutoPlayEnabled = false // bannerAutoPlayEnabled = false
if let player = getPlayer(.secondary) { // if let player = getPlayer(.secondary) {
if player.playMode == .live { // if player.playMode == .live {
leaveChannel(for: player) // leaveChannel(for: player)
} else { // } else {
player.stop() // player.stop()
} // }
} // }
} // }
private func resumeBannerPlayback() { // private func resumeBannerPlayback() {
guard bannerAutoPlayEnabled, let bannerPlayerView = bannerPlayerView else { // guard bannerAutoPlayEnabled, let bannerPlayerView = bannerPlayerView else {
return // return
} // }
if let player = getPlayer(.secondary) { // if let player = getPlayer(.secondary) {
if let playbackInfo = currentPlaybackInfo[.secondary] { // if let playbackInfo = currentPlaybackInfo[.secondary] {
if playbackInfo.isLive { // if playbackInfo.isLive {
if let token = playbackInfo.token, // if let token = playbackInfo.token,
let channelId = playbackInfo.channelId, // let channelId = playbackInfo.channelId,
let uid = playbackInfo.uid { // let uid = playbackInfo.uid {
joinChannel(for: player, // joinChannel(for: player,
token: token, // token: token,
channelId: channelId, // channelId: channelId,
uid: uid, // uid: uid,
view: bannerPlayerView, defaultMuted: true) // view: bannerPlayerView, defaultMuted: true)
} // }
} else { // } else {
if let url = playbackInfo.url { // if let url = playbackInfo.url {
player.play(url: url, // player.play(url: url,
title: playbackInfo.title, // title: playbackInfo.title,
view: bannerPlayerView) // view: bannerPlayerView)
player.isMuted = true // player.isMuted = true
} // }
} // }
} // }
//
} // }
} // }
private func enableBannerAutoPlay() { private func enableBannerAutoPlay() {
bannerAutoPlayEnabled = true bannerAutoPlayEnabled = true
......
...@@ -22,6 +22,11 @@ class YHVODPlayerViewController: YHBasePlayerViewController { ...@@ -22,6 +22,11 @@ class YHVODPlayerViewController: YHBasePlayerViewController {
return view return view
}() }()
private lazy var bottomImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "live_player_bg"))
return imageView
}()
private var isFirstAppear = true private var isFirstAppear = true
// MARK: - Initialization // MARK: - Initialization
...@@ -58,16 +63,27 @@ class YHVODPlayerViewController: YHBasePlayerViewController { ...@@ -58,16 +63,27 @@ class YHVODPlayerViewController: YHBasePlayerViewController {
override func viewWillAppear(_ animated: Bool) { override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) super.viewWillAppear(animated)
// if !isFirstAppear { if !isFirstAppear {
// player?.resume() if player?.getPlayState() != .paused {
// } if let url = playbackInfo?.url {
if player?.currentURL != nil { play(url: url, title: playbackInfo?.title)
player?.resume() player?.seek(to: startPosition)
player?.resume()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25, execute: {
self.progressControl.setPlaying(self.player?.getPlayState() == .playing)
})
}
} else {
player?.resume()
}
} }
} }
override func viewWillDisappear(_ animated: Bool) { override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated) super.viewWillDisappear(animated)
if let player = player {
startPosition = player.getPosition()
}
player?.pause() player?.pause()
} }
...@@ -81,6 +97,11 @@ class YHVODPlayerViewController: YHBasePlayerViewController { ...@@ -81,6 +97,11 @@ class YHVODPlayerViewController: YHBasePlayerViewController {
// MARK: - SetupView // MARK: - SetupView
private func setupUI() { private func setupUI() {
playerView.addSubview(bottomImageView)
bottomImageView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
containerView.addSubview(progressControl) containerView.addSubview(progressControl)
progressControl.snp.makeConstraints { make in progressControl.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview() make.left.right.bottom.equalToSuperview()
...@@ -127,7 +148,11 @@ class YHVODPlayerViewController: YHBasePlayerViewController { ...@@ -127,7 +148,11 @@ class YHVODPlayerViewController: YHBasePlayerViewController {
private func closeLive() { private func closeLive() {
YHPlayerManager.shared.stop(type: .main) YHPlayerManager.shared.stop(type: .main)
dismiss(animated: true) if let nav = navigationController, nav.viewControllers.count > 1 {
nav.popViewController(animated: true)
} else {
dismiss(animated: true)
}
} }
private func shareLive() { private func shareLive() {
......
...@@ -118,6 +118,11 @@ class YHFloatingWindow: NSObject { ...@@ -118,6 +118,11 @@ class YHFloatingWindow: NSObject {
view.frame = CGRect(x: 0, y: 0, width: Size.defaultWidth, height: 20) view.frame = CGRect(x: 0, y: 0, width: Size.defaultWidth, height: 20)
return view return view
}() }()
private lazy var bottomImageView: UIImageView = {
let imageView = UIImageView(image: UIImage(named: "live_player_bg"))
return imageView
}()
// MARK: - Initialization // MARK: - Initialization
...@@ -143,7 +148,7 @@ class YHFloatingWindow: NSObject { ...@@ -143,7 +148,7 @@ class YHFloatingWindow: NSObject {
containerView.layer.shadowOffset = CGSize(width: 0, height: 2) containerView.layer.shadowOffset = CGSize(width: 0, height: 2)
containerView.layer.shadowRadius = 4 containerView.layer.shadowRadius = 4
containerView.layer.shadowOpacity = 0.3 containerView.layer.shadowOpacity = 0.3
containerView.addSubview(contentView) containerView.addSubview(contentView)
contentView.translatesAutoresizingMaskIntoConstraints = false contentView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([ NSLayoutConstraint.activate([
...@@ -152,6 +157,15 @@ class YHFloatingWindow: NSObject { ...@@ -152,6 +157,15 @@ class YHFloatingWindow: NSObject {
contentView.topAnchor.constraint(equalTo: containerView.topAnchor), contentView.topAnchor.constraint(equalTo: containerView.topAnchor),
contentView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), contentView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor),
]) ])
contentView.addSubview(bottomImageView)
bottomImageView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
bottomImageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
bottomImageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
bottomImageView.topAnchor.constraint(equalTo: contentView.topAnchor),
bottomImageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
])
containerView.addSubview(closeButtonContainer) containerView.addSubview(closeButtonContainer)
closeButtonContainer.translatesAutoresizingMaskIntoConstraints = false closeButtonContainer.translatesAutoresizingMaskIntoConstraints = false
......
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