房间排名和首页搜索房间

This commit is contained in:
liyuhua
2024-03-22 11:54:23 +08:00
parent 56b6f40526
commit 6c2c5d586a
66 changed files with 1644 additions and 114 deletions

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "home_search_online_icon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "home_search_online_icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_home_voice_search_bg@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_home_voice_search_bg@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 881 B

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_home_voice_search_icon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_home_voice_search_icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 830 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_left_black_arrow@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_left_black_arrow@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 B

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_plane_star_send_gift_icon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_plane_star_send_gift_icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_search_vc_iocn@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_search_vc_iocn@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 703 B

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "room_send_gift_icon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "room_send_gift_icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_room_rank_first@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_room_rank_first@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_room_rank_second@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_room_rank_second@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "yin_room_rank_third@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "yin_room_rank_third@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -10,3 +10,5 @@
#import <FFPopup/FFPopup.h>
#import <MJExtension/MJExtension.h>
#import <TXLiteAVSDK_TRTC/TRTCCloud.h>
#import <JXCategoryView/JXCategoryView.h>
#import <JXCategoryView/JXCategoryListContainerView.h>

View File

@@ -12,4 +12,5 @@ enum H5Utils:String {
case user = "modules/rule/protocol.html"
case logoff = "modules/logout/index.html"
case pay = "mew/modules/rule/rechargeAgreement.html"
case rank = "modules/room_rank/index.html"
}

View File

@@ -25,6 +25,7 @@ let H5_URL = "http://beta.h5.ymlive.fun"
extension UIFont{
static func getScaleFont(ofSize:CGFloat,weight:Weight)->UIFont{
return UIFont.systemFont(ofSize: UIDevice.scaleWidth(width: ofSize), weight: weight)

View File

@@ -37,13 +37,14 @@ class WebViewController: BaseViewController {
private(set) weak var navigationDelegate: WKNavigationDelegate?
private(set) var url: String?
var isHalf:Bool = false
convenience init(
url: String?,
navigationDelegate: WKNavigationDelegate? = nil
navigationDelegate: WKNavigationDelegate? = nil,isHalf:Bool = false
) {
self.init(nibName: nil, bundle: nil)
self.url = url
self.isHalf = isHalf
if var url = url {
if !url.hasPrefix("http") {
url = "\(H5_URL)/\(url)"
@@ -76,23 +77,51 @@ class WebViewController: BaseViewController {
}
private func loadSubViews() {
view.addSubview(webview)
view.addSubview(progressView)
progressView.snp.makeConstraints { make in
make.top.equalTo(view).offset(0)
make.left.right.equalTo(view).offset(0)
make.height.equalTo(1)
}
webview.snp.makeConstraints { make in
make.top.equalTo(view).offset(1)
make.left.right.bottom.equalTo(view)
}
if self.isHalf{
let bakcBtn = UIButton()
bakcBtn.addTarget(self, action: #selector(dissViewAction), for: .touchUpInside)
view.addSubview(bakcBtn)
bakcBtn.snp.makeConstraints { make in
make.edges.equalTo(view)
}
view.addSubview(webview)
view.addSubview(progressView)
progressView.snp.makeConstraints { make in
make.top.equalTo(view).offset(0)
make.left.right.equalTo(view).offset(0)
make.height.equalTo(1)
}
view.backgroundColor = .clear
webview.snp.makeConstraints { make in
make.left.bottom.right.equalTo(view)
make.height.equalTo(ScreenHeight * 0.65)
}
}else{
view.addSubview(webview)
view.addSubview(progressView)
progressView.snp.makeConstraints { make in
make.top.equalTo(view).offset(0)
make.left.right.equalTo(view).offset(0)
make.height.equalTo(1)
}
webview.snp.makeConstraints { make in
make.top.equalTo(view).offset(1)
make.left.right.bottom.equalTo(view)
}
}
progressView.trackTintColor = .clear
progressView.transform = .init(scaleX: 1, y: 1.5)
progressView.alpha = 0
}
@objc func dissViewAction(){
self.dismiss(animated: true)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let object = object as? WKWebView, object == webview {
if keyPath == "estimatedProgress" {
@@ -164,7 +193,7 @@ class WebViewController: BaseViewController {
let str = String(data: data!,encoding:String.Encoding.utf8)
return str
}
}
extension WebViewController: WKScriptMessageHandler {

View File

@@ -106,5 +106,76 @@ extension Date {
dateformatter.dateFormat = dateFormat
return dateformatter.string(from: self)
}
private enum ConstellationType:String {
case , , , , , ,
, , , , ,
}
private static let constellationDict:[ConstellationType :String] = [.: "3.21-4.19",
.: "4.20-5.20",
.: "5.21-6.21",
.: "6.22-7.22",
.: "7.23-8.22",
.: "8.23-9.22",
.: "9.23-10.23",
.: "10.24-11.22",
.: "11.23-12.21",
.: "12.22-1.19",
.: "1.20-2.18",
.: "2.19-3.20"]
/// ->
/// - parameter date:
/// - returns:
public static func getCalculateWithDate(date: Date) -> String? {
let timeInterval = date.timeIntervalSince1970
let OneDay:Double = 86400
let currConstellation = constellationDict.filter {
let timeRange = getTimeRange(date: date, timeRange: $1)
let startTime = timeRange.0
let endTime = timeRange.1 + OneDay
return timeInterval > startTime && timeInterval < endTime
} //
return currConstellation.first?.key.rawValue ?? "摩羯座"
}
/// f.
private static func getTimeRange(date:Date, timeRange: String) -> (TimeInterval, TimeInterval) {
/// f.1
func getCurrYear(date:Date) -> String {
let dm = DateFormatter()
dm.dateFormat = "yyyy."
let currYear = dm.string(from: date)
return currYear
}
/// f.2
func toTimeInterval(dateStr: String) -> TimeInterval? {
let dm = DateFormatter()
dm.dateFormat = "yyyy.MM.dd"
let date = dm.date(from: dateStr)
let interval = date?.timeIntervalSince1970
return interval
}
let timeStrArr = timeRange.components(separatedBy: "-")
let dateYear = getCurrYear(date: date)
let startTimeStr = dateYear + timeStrArr.first!
let endTimeStr = dateYear + timeStrArr.last!
let startTime = toTimeInterval(dateStr: startTimeStr)!
let endTime = toTimeInterval(dateStr: endTimeStr)!
return (startTime, endTime)
}
}

View File

@@ -35,22 +35,22 @@ extension UIButton {
return bounds.contains(point)
}
static func getCustomBtn(text:String? = nil,selectedText:String? = nil,font:UIFont? = nil,color:UIColor? = nil,selectedColor:UIColor? = nil,image:UIImage? = nil,selectedImage:UIImage? = nil,bgImage:UIImage? = nil) -> UIButton{
let customBtn = UIButton()
static func getCustomBtn(type:UIButton.ButtonType = .custom, text:String? = nil,selectedText:String? = nil,font:UIFont? = nil,color:UIColor? = nil,selectedColor:UIColor? = nil,image:UIImage? = nil,selectedImage:UIImage? = nil,bgImage:UIImage? = nil,selectedBgImage:UIImage? = nil) -> UIButton{
let customBtn = UIButton(type: type)
if let _text = text{
customBtn.setTitle(text, for: .normal)
customBtn.setTitle(_text, for: .normal)
}
if let _selectedText = selectedText{
customBtn.setTitle(selectedText, for: .selected)
customBtn.setTitle(_selectedText, for: .selected)
}
if let _font = font{
customBtn.titleLabel?.font = font
customBtn.titleLabel?.font = _font
}
if let _color = color{
customBtn.setTitleColor(color, for: .normal)
customBtn.setTitleColor(_color, for: .normal)
}
if let _selectedColor = selectedColor{
customBtn.setTitleColor(selectedColor, for: .selected)
customBtn.setTitleColor(_selectedColor, for: .selected)
}
if let _image = image{
customBtn.setImage(_image, for: .normal)
@@ -61,6 +61,9 @@ extension UIButton {
if let _bgImage = bgImage{
customBtn.setBackgroundImage(_bgImage, for: .normal)
}
if let _selectedBgImage = selectedBgImage{
customBtn.setBackgroundImage(_selectedBgImage, for: .selected)
}
return customBtn
}

View File

@@ -7,10 +7,17 @@
import Foundation
extension UILabel{
static func getCustomLabel(text:String? = "",font:UIFont? = nil,color:UIColor? = nil,textAlignment:NSTextAlignment? = .left,numberOfLines:Int? = 1)->UILabel{
static func getCustomLabel(text:String? = "",font:UIFont? = nil,color:UIColor? = nil,textAlignment:NSTextAlignment? = .left,numberOfLines:Int? = 1,backgroundColor:UIColor? = nil,masksToBounds:Bool = false,cornerRadius:CGFloat = 0,borderWidth:CGFloat = 0,borderColor:UIColor? = nil)->UILabel{
let customView = UILabel()
customView.layer.masksToBounds = masksToBounds
customView.layer.cornerRadius = cornerRadius
customView.layer.borderWidth = borderWidth
if let _borderColor = borderColor{
customView.layer.borderColor = _borderColor.cgColor
}
if let _text = text {
customView.text = text
customView.text = _text
}
if let _font = font {
customView.font = _font
@@ -24,6 +31,9 @@ extension UILabel{
if let _numberOfLines = numberOfLines{
customView.numberOfLines = _numberOfLines
}
if let _backgroundColor = backgroundColor{
customView.backgroundColor = _backgroundColor
}
return customView
}
static func getLabelHeigth(text:String,width:CGFloat,font:UIFont)-> CGFloat{

View File

@@ -16,10 +16,13 @@ class AuthViewModel: NSObject {
var appId = ""
let loginSuccess = BehaviorSubject(value: false)
let resetPwd = PublishSubject<Bool>()
var clientInfoModel:YinClientInfoModel?
func appClientConfig() {
RequestGet(path: "client/init", parma: [:]) { data in
if let account = Deserialized<YinClientInfoModel>.toModel(with: data) {
self.clientInfoModel = account
}
if let _data = data as? [String:Any],let appId = _data["trtcAppId"] {
AuthViewModel.authVM.appId = "\(appId)"
}

View File

@@ -0,0 +1,12 @@
//
// YinClientInfoModel.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/22.
//
import UIKit
import HandyJSON
struct YinClientInfoModel: HandyJSON {
var h5Uris:[YinRankH5UrlModel] = []
}

View File

@@ -0,0 +1,13 @@
//
// YinRankH5UrlModel.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/22.
//
import UIKit
import HandyJSON
struct YinRankH5UrlModel: HandyJSON {
var code = ""
var uri = ""
}

View File

@@ -0,0 +1,115 @@
//
// HomeSearchNavView.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/21.
//
import UIKit
typealias ClickSearchBlcok = (_ type:Int)->Void
class HomeSearchNavView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setUILayout()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setUILayout(){
addSubview(leftArrowBtn)
addSubview(bgSearchView)
addSubview(searchBtn)
bgSearchView.addSubview(searchIconView)
bgSearchView.addSubview(textField)
leftArrowBtn.snp.makeConstraints { make in
make.width.height.equalTo(UIDevice.scaleWidth(width: 22))
make.leading.equalTo(UIDevice.scaleWidth(width: 8))
make.centerY.equalTo(bgSearchView)
}
bgSearchView.snp.makeConstraints { make in
make.height.equalTo(UIDevice.scaleWidth(width: 30))
make.leading.equalTo(leftArrowBtn.snp.trailing).offset((UIDevice.scaleWidth(width: 5)))
make.trailing.equalTo(searchBtn.snp.leading).offset(-UIDevice.scaleWidth(width: 13))
make.top.equalTo(UIDevice.scaleWidth(width: StatusBarHeight + 10))
}
searchBtn.snp.makeConstraints { make in
make.trailing.equalTo(-UIDevice.scaleWidth(width: 15))
make.centerY.equalTo(bgSearchView)
make.height.equalTo(UIDevice.scaleWidth(width: 30))
}
searchIconView.snp.makeConstraints { make in
make.width.height.equalTo(UIDevice.scaleWidth(width: 28))
make.centerY.equalTo(bgSearchView)
make.leading.equalTo(UIDevice.scaleWidth(width: 9))
}
textField.snp.makeConstraints { make in
make.leading.equalTo(searchIconView.snp.trailing).offset((UIDevice.scaleWidth(width: 0)))
make.trailing.top.bottom.equalTo(bgSearchView)
}
leftArrowBtn.addTarget(self, action: #selector(leftArroAction), for: .touchUpInside)
searchBtn.addTarget(self, action: #selector(searchBtnAction), for: .touchUpInside)
}
@objc func leftArroAction(){
if let clickSearchBlcok = self.clickSearchBlcok{
clickSearchBlcok(0)
}
}
@objc func searchBtnAction(){
textField.resignFirstResponder()
if let clickSearchBlcok = self.clickSearchBlcok{
clickSearchBlcok(1)
}
}
//MARK: -
var clickSearchBlcok:ClickSearchBlcok?
private lazy var leftArrowBtn:UIButton = {
let _leftArrowBtn = UIButton.getCustomBtn(image: UIImage(named: "yin_left_black_arrow"))
_leftArrowBtn.setBtnClickRadius = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
return _leftArrowBtn
}()
private lazy var bgSearchView:UIView = {
let _bgSearchView = UIView()
_bgSearchView.backgroundColor = .white
_bgSearchView.layer.cornerRadius = UIDevice.scaleWidth(width: 30)/2
_bgSearchView.layer.masksToBounds = true
return _bgSearchView
}()
private lazy var searchIconView:UIImageView = {
let _searchIconView = UIImageView()
_searchIconView.isUserInteractionEnabled = true
_searchIconView.image = UIImage(named: "yin_search_vc_iocn")
return _searchIconView
}()
lazy var textField:UITextField = {
let _textField = UITextField()
_textField.layer.cornerRadius = UIDevice.scaleWidth(width: 30)/2
_textField.layer.masksToBounds = true
_textField.tintColor = ThemeColor(hexStr: "#878B9C")
_textField.textColor = ThemeColor(hexStr: "#282828")
_textField.backgroundColor = .clear
_textField.font = UIFont.getScaleFont(ofSize: 13, weight: .regular)
let att = NSAttributedString(string: "搜索昵称/ID/房间名",attributes: [.font:UIFont.getScaleFont(ofSize: 13, weight: .regular),.foregroundColor:ThemeColor(hexStr: "#878B9C")])
_textField.attributedPlaceholder = att
_textField.clearButtonMode = .whileEditing
_textField.returnKeyType = .search
_textField.enablesReturnKeyAutomatically = true
return _textField
}()
private lazy var searchBtn:UIButton = {
let _searchBtn = UIButton.getCustomBtn(text: "搜索",font: UIFont.getScaleFont(ofSize: 16, weight: .medium),color: ThemeColor(hexStr: "#878B9C"))
_searchBtn.setBtnClickRadius = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
return _searchBtn
}()
}

View File

@@ -0,0 +1,166 @@
//
// HomeSearchRoomCell.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/21.
//
import UIKit
import Nuke
class HomeSearchRoomCell: UITableViewCell {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setUILayout()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setUILayout(){
selectionStyle = .none
backgroundColor = .clear
contentView.addSubview(avatarView)
contentView.addSubview(nickStackView)
contentView.addSubview(idView)
contentView.addSubview(numView)
contentView.addSubview(dividerView)
numView.addSubview(onlienTextView)
numView.addSubview(bgOnlineView)
nickStackView.addArrangedSubview(textVeiw)
nickStackView.addArrangedSubview(genderView)
avatarView.snp.makeConstraints { make in
make.width.height.equalTo(UIDevice.scaleWidth(width: 45))
make.leading.equalTo(UIDevice.scaleWidth(width: 15))
make.centerY.equalTo(contentView)
}
nickStackView.snp.makeConstraints { make in
make.leading.equalTo(avatarView.snp.trailing).offset((UIDevice.scaleWidth(width: 13)))
make.height.equalTo(UIDevice.scaleWidth(width: 20))
make.bottom.equalTo(avatarView.snp.centerY).offset(-UIDevice.scaleWidth(width: 1.5))
}
idView.snp.makeConstraints { make in
make.leading.equalTo(nickStackView)
make.top.equalTo(avatarView.snp.centerY).offset(UIDevice.scaleWidth(width: 1.5))
}
dividerView.snp.makeConstraints { make in
make.leading.equalTo(nickStackView)
make.trailing.equalTo(-UIDevice.scaleWidth(width: 15))
make.bottom.equalTo(contentView)
make.height.equalTo(UIDevice.scaleWidth(width: 1))
}
numView.snp.makeConstraints { make in
make.height.equalTo(UIDevice.scaleWidth(width: 18))
make.trailing.equalTo(-UIDevice.scaleWidth(width: 15))
make.centerY.equalTo(contentView)
make.leading.equalTo(bgOnlineView.snp.leading).offset(-UIDevice.scaleWidth(width: 8))
}
onlienTextView.snp.makeConstraints { make in
make.centerY.equalTo(numView)
make.trailing.equalTo(numView.snp.trailing).offset(-UIDevice.scaleWidth(width:5))
}
bgOnlineView.snp.makeConstraints { make in
make.width.equalTo(UIDevice.scaleWidth(width: 10))
make.height.equalTo(UIDevice.scaleWidth(width: 9))
make.centerY.equalTo(numView)
make.trailing.equalTo(onlienTextView.snp.leading).offset(-UIDevice.scaleWidth(width:3))
}
}
func setModel(model:HomeSearchRoomModel,type:Int){
Nuke.loadImage(with: model.avatar, into: avatarView, completion: nil)
textVeiw.text = type == 0 ? model.title : model.nick
idView.text = "ID:" + model.erbanNo
genderView.image = model.gender == .Boy ? UIImage(named: "yin_plane_star_man") : UIImage(named: "yin_plane_star__woman")
if type == 0{
if model.onlineNum > 100{
onlienTextView.text = "\(model.onlineNum)"
}else{
onlienTextView.text = " \(model.onlineNum) "
}
numView.isHidden = !model.valid
return
}
onlienTextView.text = "直播中"
numView.isHidden = model.roomUid.count <= 0
}
//MARK: -
private lazy var avatarView:UIImageView = {
let _avatarView = UIImageView()
_avatarView.layer.cornerRadius = UIDevice.scaleWidth(width: 45)/2
_avatarView.layer.masksToBounds = true
_avatarView.contentMode = .scaleAspectFill
return _avatarView
}()
private lazy var nickStackView:UIStackView = {
let _nickStackView = UIStackView()
_nickStackView.axis = .horizontal
_nickStackView.distribution = .fill
_nickStackView.alignment = .center
_nickStackView.spacing = UIDevice.scaleWidth(width: 2)
return _nickStackView
}()
private lazy var textVeiw:UILabel = {
let _textVeiw = UILabel.getCustomLabel(font: UIFont.getScaleFont(ofSize: 15, weight: .regular),color: ThemeColor(hexStr: "#878B9C"))
return _textVeiw
}()
private lazy var genderView:UIImageView = {
let _genderView = UIImageView()
_genderView.isUserInteractionEnabled = true
return _genderView
}()
private lazy var idView:UILabel = {
let _idView = UILabel.getCustomLabel(font: UIFont.getScaleFont(ofSize: 13, weight: .regular),color: ThemeColor(hexStr: "#BDBFD0"))
return _idView
}()
private lazy var dividerView:UIView = {
let _dividerView = UIView()
_dividerView.backgroundColor = ThemeColor(hexStr: "#E8E8E8")
return _dividerView
}()
private lazy var numView:UIView = {
let _numView = UIView()
_numView.backgroundColor = .clear
_numView.layer.masksToBounds = true
_numView.layer.cornerRadius = UIDevice.scaleWidth(width: 18)/2
_numView.layer.borderColor = ThemeColor(hexStr: "#248CFE").cgColor
_numView.layer.borderWidth = 1
return _numView
}()
private lazy var bgOnlineView:UIImageView = {
let _bgOnlineView = UIImageView()
_bgOnlineView.image = UIImage(named: "home_search_online_icon")
return _bgOnlineView
}()
private lazy var onlienTextView:UILabel = {
let _onlienTextView = UILabel.getCustomLabel(text: "直播中",font: UIFont.getScaleFont(ofSize: 10, weight: .regular),color: ThemeColor(hexStr: "#248CFE"))
return _onlienTextView
}()
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}

View File

@@ -0,0 +1,28 @@
//
// HomeSearchRoomModel.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/21.
//
import Foundation
import HandyJSON
struct HomeSearchRoomModel:HandyJSON{
var avatar = ""
var onlineNum:Int = 0
var uid = ""
var title = ""
var nick = ""
var erbanNo = ""
var valid = false
var gender:UserSexType = .Boy
var roomUid = ""
}

View File

@@ -0,0 +1,93 @@
//
// HomeSearchRoomVC.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/21.
//
import UIKit
class HomeSearchRoomVC: BaseViewController {
init(type:Int){
super.init(nibName: nil, bundle: nil)
self.type = type
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
setUILayout()
}
private func setUILayout(){
view.addSubview(tableView)
view.backgroundColor = .clear
tableView.snp.makeConstraints { make in
make.edges.equalTo(view)
}
tableView.delegate = self
tableView.dataSource = self
tableView.register(HomeSearchRoomCell.self, forCellReuseIdentifier: "HomeSearchRoomCell")
}
func requestData(text:String){
let params = ["page":"1","pageSize":"50","key":text,"type":"\(type+1)"]
RequestGet(path: "search/room", parma: params) { data in
if let list = Deserialized<HomeSearchRoomModel>.toArray(with: data) {
self.listData = list
self.tableView.reloadData()
}
} fail: { code, message in
HUDTool.show(with: message)
}
}
var listData:[HomeSearchRoomModel] = []
var type:Int = 0
//MARK: -
private lazy var tableView:UITableView = {
let _tableView = UITableView(frame: .zero, style: .plain)
_tableView.tableHeaderView = UIView()
_tableView.tableFooterView = UIView()
_tableView.separatorStyle = .none
_tableView.backgroundColor = .clear
return _tableView
}()
}
extension HomeSearchRoomVC:JXCategoryListContentViewDelegate,UITableViewDelegate,UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return listData.count
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UIDevice.scaleWidth(width: 74)
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "HomeSearchRoomCell", for: indexPath) as! HomeSearchRoomCell
cell.setModel(model: listData[indexPath.row], type: type)
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if type == 1 {return}
let model = listData[indexPath.row]
if model.valid {
self.dismiss(animated: true) {
let vc = RoomVC(roomUid: model.uid)
vc.roomText = model.title + "的房间"
let nav = BaseNavigationViewController.init(rootViewController: vc)
nav.modalPresentationStyle = .fullScreen
keyWindow.rootViewController?.present(nav, animated: true, completion: nil)
}
return
}
HUDTool.show(with: "该用户的房间已失效")
}
func listView() -> UIView! {
return self.view
}
}

View File

@@ -0,0 +1,121 @@
//
// HomeSearchVC.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/21.
//
import UIKit
class HomeSearchVC: BaseViewController,HiddenNavigationBarProtocol {
override func viewDidLoad() {
super.viewDidLoad()
setUILayout()
requestData()
}
private func setUILayout(){
view.addSubview(navView)
view.addSubview(pageTitleView)
view.addSubview(containerView)
view.backgroundColor = ThemeColor(hexStr: "#F8F8FB")
navView.snp.makeConstraints { make in
make.leading.trailing.top.equalTo(view)
make.height.equalTo(NavHeight)
}
pageTitleView.snp.makeConstraints { make in
make.leading.trailing.equalTo(view).inset(UIDevice.scaleWidth(width: 0))
make.top.equalTo(navView.snp.bottom).offset(UIDevice.scaleWidth(width: 10))
make.height.equalTo(UIDevice.scaleWidth(width: 50))
}
containerView.snp.makeConstraints { make in
make.top.equalTo(pageTitleView.snp.bottom).offset(UIDevice.scaleWidth(width: 10))
make.leading.trailing.bottom.equalTo(view)
}
navView.textField.delegate = self
navView.clickSearchBlcok = {[weak self] type in
guard let self = self else { return }
if type == 0{
self.dismiss(animated: true, completion: nil)
return
}
self.roomView.requestData(text:self.navView.textField.text ?? "")
self.userView.requestData(text: self.navView.textField.text ?? "")
}
pageTitleView.listContainer = containerView
}
private func requestData(){
}
//MARK: -
private lazy var navView:HomeSearchNavView = {
let _navView = HomeSearchNavView(frame: .zero)
return _navView
}()
private lazy var pageTitleView:JXCategoryTitleView = {
let _pageTitleView = JXCategoryTitleView()
_pageTitleView.delegate = self
_pageTitleView.titles = ["房间","用户"]
_pageTitleView.titleColor = ThemeColor(hexStr: "#878B9C")
_pageTitleView.titleSelectedColor = ThemeColor(hexStr: "#282828")
_pageTitleView.titleFont = UIFont.getScaleFont(ofSize: 16, weight: .medium)
_pageTitleView.titleSelectedFont = UIFont.getScaleFont(ofSize: 16, weight: .medium)
_pageTitleView.titleLabelAnchorPointStyle = JXCategoryTitleLabelAnchorPointStyle.center
_pageTitleView.isContentScrollViewClickTransitionAnimationEnabled = false
_pageTitleView.defaultSelectedIndex = 0
let lineView = JXCategoryIndicatorLineView()
lineView.indicatorColor = ThemeColor(hexStr: "#FFE710")
lineView.indicatorWidth = UIDevice.scaleWidth(width: 8)
lineView.indicatorHeight = UIDevice.scaleWidth(width: 8) / 2
lineView.indicatorCornerRadius = UIDevice.scaleWidth(width: 8) / 4
_pageTitleView.indicators = [lineView]
return _pageTitleView
}()
private lazy var containerView:JXCategoryListContainerView = {
let _containerView = JXCategoryListContainerView.init(type: .scrollView, delegate: self)!
_containerView.setDefaultSelectedIndex(0)
return _containerView
}()
private lazy var roomView:HomeSearchRoomVC = {
let _roomView = HomeSearchRoomVC(type: 0)
return _roomView
}()
private lazy var userView:HomeSearchRoomVC = {
let _userView = HomeSearchRoomVC(type: 1)
return _userView
}()
}
extension HomeSearchVC:JXCategoryListContainerViewDelegate,JXCategoryViewDelegate,UITextFieldDelegate{
func number(ofListsInlistContainerView listContainerView: JXCategoryListContainerView!) -> Int {
return 2
}
func listContainerView(_ listContainerView: JXCategoryListContainerView!, initListFor index: Int) -> JXCategoryListContentViewDelegate! {
return index == 0 ? roomView : userView
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
guard let text = textField.text else {
HUDTool.show(with: "请输入需要搜索的内容")
return true
}
if text.count > 0{
textField.resignFirstResponder()
roomView.requestData(text: text)
userView.requestData(text: text)
}else{
HUDTool.show(with: "请输入需要搜索的内容")
}
return true
}
}

View File

@@ -21,4 +21,5 @@ struct HomeVoiceModel : HandyJSON, Codable {
var userVoice = ""
var voiceDura = ""
var userDesc = ""
var birth:Int64 = 0
}

View File

@@ -0,0 +1,55 @@
//
// HomeVoiceSearchView.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/20.
//
import UIKit
class HomeVoiceSearchView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setUILayout()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setUILayout(){
addSubview(bgImageView)
addSubview(iconView)
addSubview(textVeiw)
bgImageView.snp.makeConstraints { make in
make.edges.equalTo(self)
}
iconView.snp.makeConstraints { make in
make.width.height.equalTo(UIDevice.scaleWidth(width: 18))
make.leading.equalTo(UIDevice.scaleWidth(width: 9))
make.centerY.equalTo(self)
}
textVeiw.snp.makeConstraints { make in
make.leading.equalTo(UIDevice.scaleWidth(width: 31))
make.centerY.equalTo(self)
}
}
//MARK: -
private lazy var bgImageView:UIImageView = {
let _bgImageView = UIImageView()
_bgImageView.image = UIImage(named: "yin_home_voice_search_bg")
return _bgImageView
}()
private lazy var iconView:UIImageView = {
let _iconView = UIImageView()
_iconView.image = UIImage(named: "yin_home_voice_search_icon")
return _iconView
}()
private lazy var textVeiw:UILabel = {
let _textVeiw = UILabel.getCustomLabel(text: "搜索房间",font: UIFont.getScaleFont(ofSize: 14, weight: .regular),color: ThemeColor(hexStr: "#CCCCCC"))
return _textVeiw
}()
}

View File

@@ -9,7 +9,7 @@ import UIKit
import Nuke
typealias ClickBtnBlock = (_ type: Int ,_ model:HomeVoiceModel)->Void
typealias ClickBtnBlock = (_ type: Int ,_ uid:String)->Void
class HomeVoiceUserInfoView: UIView {
@@ -33,12 +33,16 @@ class HomeVoiceUserInfoView: UIView {
bgVoiceVeiw.addSubview(playBtn)
bgVoiceVeiw.addSubview(waveView)
bgVoiceVeiw.addSubview(playTimeView)
backgroundView.addSubview(lineView)
backgroundView.addSubview(attentionBtn)
backgroundView.addSubview(lineView1)
backgroundView.addSubview(chatBtn)
backgroundView.addSubview(tagStackView)
tagStackView.addArrangedSubview(attentionBtn)
tagStackView.addArrangedSubview(lineView1)
tagStackView.addArrangedSubview(sendGfitBtn)
tagStackView.addArrangedSubview(lineView2)
tagStackView.addArrangedSubview(chatBtn)
dissView.snp.makeConstraints { make in
make.edges.equalTo(self)
}
@@ -79,7 +83,7 @@ class HomeVoiceUserInfoView: UIView {
make.height.equalTo(128)
}
signatureView.snp.makeConstraints { make in
make.left.top.right.equalTo(16)
make.left.top.right.equalTo(self.bgSignatureView).inset(16)
make.height.equalTo(54)
}
@@ -112,21 +116,22 @@ class HomeVoiceUserInfoView: UIView {
make.top.equalTo(self.bgSignatureView.snp.bottom).offset(16)
}
tagStackView.snp.makeConstraints { make in
make.leading.bottom.trailing.equalTo(backgroundView)
make.top.equalTo(230)
}
lineView1.snp.makeConstraints { make in
make.width.equalTo(1)
make.height.equalTo(18)
make.top.equalTo(237)
make.centerX.equalTo(self.backgroundView)
}
attentionBtn.snp.makeConstraints { make in
make.top.equalTo(self.lineView)
make.bottom.left.equalTo(self.backgroundView)
make.right.equalTo(self.lineView1.snp.left)
}
chatBtn.snp.makeConstraints { make in
make.top.height.width.equalTo(self.attentionBtn)
make.left.equalTo(self.lineView1.snp.right)
lineView2.snp.makeConstraints { make in
make.width.equalTo(1)
make.height.equalTo(18)
}
let layer = CAShapeLayer()
let path = UIBezierPath.init(roundedRect: CGRect(x: 0, y: 0, width: 130, height: 28), byRoundingCorners: [.topRight , .bottomRight,.bottomLeft] , cornerRadii: CGSize(width: 14, height: 14))
layer.path = path.cgPath
@@ -137,16 +142,17 @@ class HomeVoiceUserInfoView: UIView {
}
@objc func attentionBtnAction(){
if self.type == 1{
if let _clickBtnBlock = clickBtnBlock,let _model = self.model{
_clickBtnBlock(3,_model)
if let _clickBtnBlock = clickBtnBlock,let uid = self.model?.uid{
_clickBtnBlock(3,"\(uid)")
}
return
}
self.attentionBtn.isSelected = !self.attentionBtn.isSelected
let type = self.attentionBtn.isSelected ? "1" : "2"
guard let uid = self.model?.uid else{return}
let params = ["uid":"\(AuthManager.userUid)","ticket":AuthManager.ticket,"type":type,"likedUid":"\(uid)"] as [String : Any]
let uid = self.model != nil ? self.model?.uid : self.user?.uid
guard let getUid = uid else{return}
let params = ["uid":"\(AuthManager.userUid)","ticket":AuthManager.ticket,"type":type,"likedUid":"\(getUid)"] as [String : Any]
RequestPost(path: "fans/like", parma: params) { data in
if(self.attentionBtn.isSelected){
@@ -160,14 +166,17 @@ class HomeVoiceUserInfoView: UIView {
}
@objc func chatBtnAction(){
if self.type == 1{
if let _clickBtnBlock = clickBtnBlock,let _model = self.model{
_clickBtnBlock(4,_model)
if let _clickBtnBlock = clickBtnBlock,let uid = self.model?.uid{
_clickBtnBlock(4,"\(uid)")
}
return
}
if let _clickBtnBlock = clickBtnBlock,let _model = self.model{
_clickBtnBlock(0,_model)
if let _clickBtnBlock = clickBtnBlock, let uid = self.model?.uid{
_clickBtnBlock(0,"\(uid)")
}
if let _clickBtnBlock = clickBtnBlock,let uid = self.user?.uid{
_clickBtnBlock(0,"\(uid)")
}
}
@objc func playVoiceAction(){
@@ -182,6 +191,42 @@ class HomeVoiceUserInfoView: UIView {
}
}
var user:UserObject? = nil{
didSet{
guard let _user = user else { return }
Nuke.loadImage(with: _user.avatar, into: avatarView)
nameTextView.text = _user.nick
sexImageView.image = _user.gender == .Boy ? UIImage(named: "yin_plane_star_man") : UIImage(named: "yin_plane_star__woman")
signatureView.text = _user.userDesc.isEmpty ? "这个人很懒还没有签名" : _user.userDesc
bgVoiceVeiw.isHidden = true
guard let uid = _user.uid else{return}
let params = ["uid":uid]
RequestGet(path: "user/get", parma: params) { data in
if let info = Deserialized<UserObject>.toModel(with: data) {
self.signatureView.text = info.userDesc.isEmpty ? "这个人很懒还没有签名" : info.userDesc
let timeStamp = info.birth / 1000
let timeInterval:TimeInterval = TimeInterval(timeStamp)
let date = NSDate(timeIntervalSince1970: timeInterval) as Date
self.starView.text = Date.getCalculateWithDate(date: date)
self.starView.isHidden = false
}
} fail: { code, message in
}
RequestGet(path: "fans/islike", parma: ["uid":"\(AuthManager.userUid)","isLikeUid":"\(uid)"]) { data in
if let isLike = data as? Bool{
self.attentionBtn.isSelected = isLike
}
} fail: { code, data in
}
}
}
var model:HomeVoiceModel? = nil {
didSet{
guard let _model = model else {
@@ -190,8 +235,16 @@ class HomeVoiceUserInfoView: UIView {
Nuke.loadImage(with: _model.avatar, into: avatarView)
nameTextView.text = _model.nick
sexImageView.image = _model.gender == 1 ? UIImage(named: "yin_plane_star_man") : UIImage(named: "yin_plane_star__woman")
let timeStamp = _model.birth / 1000
let timeInterval:TimeInterval = TimeInterval(timeStamp)
let date = NSDate(timeIntervalSince1970: timeInterval) as Date
starView.text = Date.getCalculateWithDate(date: date)
starView.text = "天蠍座"
starView.isHidden = false
signatureView.text = _model.userDesc.isEmpty ? "这个人很懒还没有签名" : _model.userDesc
bgVoiceVeiw.isHidden = _model.userVoice.isEmpty
playTimeView.text = "\(_model.voiceDura)\""
@@ -255,6 +308,7 @@ class HomeVoiceUserInfoView: UIView {
_starView.backgroundColor = ThemeColor(hexStr: "#E9E1FF")
_starView.layer.cornerRadius = 9
_starView.layer.masksToBounds = true
_starView.isHidden = true
return _starView
}()
var bgSignatureView:UIView = {
@@ -269,6 +323,7 @@ class HomeVoiceUserInfoView: UIView {
_signatureView.font = UIFont.systemFont(ofSize: 13, weight: .regular)
_signatureView.textColor = ThemeColor(hexStr: "#1F1B4F")
_signatureView.text = ""
_signatureView.numberOfLines = 0
return _signatureView
}()
@@ -298,21 +353,39 @@ class HomeVoiceUserInfoView: UIView {
_playTimeView.font = UIFont.systemFont(ofSize: 14, weight: .medium)
return _playTimeView
}()
var type:Int = 0 {
didSet{
lineView2.isHidden = true
sendGfitBtn.isHidden = true
if type == 0{
attentionBtn.setImage(UIImage(named: "yin_plane_star_no_attention_icon"), for: .normal)
attentionBtn.setTitle(" 关注", for: .normal)
chatBtn.setImage(UIImage(named: "yin_home_voice_chat_icon"), for: .normal)
chatBtn.setTitle(" 私聊", for: .normal)
}else{
}else if type == 1{
attentionBtn.setImage(UIImage(named: "yin_plane_star_pay_icon"), for: .normal)
attentionBtn.setTitle(" 充值", for: .normal)
chatBtn.setImage(UIImage(named: "yin_home_voice_collect_icon"), for: .normal)
chatBtn.setTitle(" 收藏", for: .normal)
}else{
attentionBtn.setImage(UIImage(named: "yin_plane_star_no_attention_icon"), for: .normal)
attentionBtn.setTitle(" 关注", for: .normal)
chatBtn.setImage(UIImage(named: "yin_home_voice_chat_icon"), for: .normal)
chatBtn.setTitle(" 私聊", for: .normal)
lineView2.isHidden = false
sendGfitBtn.isHidden = false
}
}
}
private lazy var tagStackView:UIStackView = {
let _tagStackView = UIStackView()
_tagStackView.axis = .horizontal
_tagStackView.distribution = .fillProportionally
_tagStackView.alignment = .center
_tagStackView.spacing = UIDevice.scaleWidth(width: 0)
return _tagStackView
}()
var attentionBtn:UIButton = {
let _attentionBtn = UIButton()
@@ -326,6 +399,20 @@ class HomeVoiceUserInfoView: UIView {
return _attentionBtn
}()
var sendGfitBtn:UIButton = {
let _sendGfitBtn = UIButton()
_sendGfitBtn.setImage(UIImage(named: "yin_plane_star_send_gift_icon"), for: .normal)
_sendGfitBtn.setTitle(" 送礼", for: .normal)
_sendGfitBtn.setTitleColor(.white, for: .normal)
_sendGfitBtn.titleLabel?.font = UIFont.systemFont(ofSize: 15, weight: .medium)
_sendGfitBtn.setImage(UIImage(named: "yin_plane_star_send_gift_icon"), for: .selected)
_sendGfitBtn.addTarget(self, action: #selector(attentionBtnAction), for: .touchUpInside)
return _sendGfitBtn
}()
var chatBtn:UIButton = {
let _chatBtn = UIButton()
@@ -350,5 +437,12 @@ class HomeVoiceUserInfoView: UIView {
return _lineView1
}()
var lineView2:UIView = {
let _lineView2 = UIView()
_lineView2.backgroundColor = UIColor.init(white: 1, alpha: 0.2)
return _lineView2
}()
}

View File

@@ -35,13 +35,13 @@ class HomeVoiceVC: BaseViewController,HiddenNavigationBarProtocol {
}
@objc func userInfoBtnAction(){
let userInfoView:HomeVoiceUserInfoView = HomeVoiceUserInfoView.init(frame: .zero)
userInfoView.clickBtnBlock = {[weak self] (type,model) in
userInfoView.clickBtnBlock = {[weak self] (type,uid) in
guard let weakSelf = self else {
return
}
if type == 3{
let vc = UserPayViewController()
self?.navigationController?.pushViewController(vc, animated: true)
weakSelf.navigationController?.pushViewController(vc, animated: true)
return
}
}
@@ -69,6 +69,7 @@ class HomeVoiceVC: BaseViewController,HiddenNavigationBarProtocol {
view.addSubview(backgroundView)
view.addSubview(scrollView)
scrollView.addSubview(topLogoIcon)
scrollView.addSubview(searchView)
scrollView.addSubview(chooseItemVeiw)
scrollView.addSubview(changeItemView)
scrollView.addSubview(userInfoBtn)
@@ -89,9 +90,16 @@ class HomeVoiceVC: BaseViewController,HiddenNavigationBarProtocol {
topLogoIcon.snp.makeConstraints { make in
make.left.equalTo(20)
make.top.equalTo(14 + NavHeight)
make.width.equalTo(260)
make.width.equalTo(76)
make.height.equalTo(23)
}
searchView.snp.makeConstraints { make in
make.leading.equalTo(topLogoIcon.snp.trailing).offset((UIDevice.scaleWidth(width: 18)))
make.height.equalTo(UIDevice.scaleWidth(width: 30))
make.width.equalTo(UIDevice.scaleWidth(width: 240))
make.centerY.equalTo(topLogoIcon)
}
chooseItemVeiw.snp.makeConstraints { make in
make.left.equalTo(20)
make.top.equalTo(self.topLogoIcon.snp.bottom).offset(18)
@@ -172,13 +180,14 @@ class HomeVoiceVC: BaseViewController,HiddenNavigationBarProtocol {
return
}
let userInfoView:HomeVoiceUserInfoView = HomeVoiceUserInfoView.init(frame: .zero)
userInfoView.clickBtnBlock = {[weak self] (type,model) in
userInfoView.clickBtnBlock = {[weak self] (type,uid) in
let session = NIMSession("\(model.uid)", type: .P2P)
let session = NIMSession(uid, type: .P2P)
let chatVC = ChatVC.init(session: session)
self?.navigationController?.pushViewController(chatVC, animated: true)
}
userInfoView.model = model
userInfoView.type = 0
weakSelf.view.addSubview(userInfoView)
userInfoView.snp.makeConstraints { make in
make.edges.equalTo(weakSelf.view)
@@ -192,8 +201,15 @@ class HomeVoiceVC: BaseViewController,HiddenNavigationBarProtocol {
make.edges.equalTo((self?.view)!)
}
}
let searchTap = UITapGestureRecognizer(target: self, action: #selector(clickSearchAction))
searchView.addGestureRecognizer(searchTap)
}
@objc func clickSearchAction(){
let searchVC = HomeSearchVC()
searchVC.modalPresentationStyle = .fullScreen
navigationController?.present(searchVC, animated: true, completion: nil)
}
@objc func clickLongTapAction(sender:UIPanGestureRecognizer){
let i = (sender.view?.tag ?? 100) - 100
if sender.state == .began{
@@ -233,12 +249,13 @@ class HomeVoiceVC: BaseViewController,HiddenNavigationBarProtocol {
}
let userInfoView:HomeVoiceUserInfoView = HomeVoiceUserInfoView.init(frame: .zero)
userInfoView.clickBtnBlock = {[weak self] (type,model) in
userInfoView.clickBtnBlock = {[weak self] (type,uid) in
let session = NIMSession("\(model.uid)", type: .P2P)
let session = NIMSession(uid, type: .P2P)
let chatVC = ChatVC.init(session: session)
self?.navigationController?.pushViewController(chatVC, animated: true)
}
userInfoView.type = 0
userInfoView.model = view.model
self.view.addSubview(userInfoView)
userInfoView.snp.makeConstraints { make in
@@ -321,7 +338,11 @@ class HomeVoiceVC: BaseViewController,HiddenNavigationBarProtocol {
_changeItemView.text = "换一换"
return _changeItemView
}()
private lazy var searchView:HomeVoiceSearchView = {
let _searchView = HomeVoiceSearchView(frame: .zero)
return _searchView
}()
var userInfoBtn:UIButton = {
let _userInfoBtn = UIButton()
_userInfoBtn.setBackgroundImage(UIImage(named: "yin_home_voice_user_info_bg"), for: .normal)

View File

@@ -0,0 +1,12 @@
//
// YinRoomAudioanager.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/22.
//
import UIKit
class YinRoomAudMioanager: NSObject {
}

View File

@@ -0,0 +1,26 @@
//
// YinRoomTRTCManager.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/22.
//
import UIKit
class YinRoomTRTCManager: NSObject {
override init() {
}
private func initRTRC(){
let cloud = TRTCCloud.sharedInstance()
let params = TRTCAudioVolumeEvaluateParams()
params.interval = 900
cloud.enableAudioVolumeEvaluation(true, with: params)
TRTCCloud.setConsoleEnabled(false)
TRTCCloud.sharedInstance().addDelegate(self)
}
}
extension YinRoomTRTCManager:TRTCCloudDelegate{
}

View File

@@ -49,21 +49,31 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol {
RoomVCViewModel.roomVM.isMute = true
NIMSDK.shared().chatroomManager.exitChatroom(self.roomInfo?.roomId ?? "")
self.dismiss(animated: true, completion: nil)
return
}
TRTCCloud.sharedInstance().exitRoom()
TRTCCloud.sharedInstance().muteAllRemoteAudio(false)
TRTCCloud.sharedInstance().muteLocalAudio(false)
RoomVCViewModel.roomVM.isMute = true
NIMSDK.shared().chatroomManager.exitChatroom(self.roomInfo?.roomId ?? "")
self.dismiss(animated: true, completion: nil)
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
let vc = RoomVC(roomUid: uid)
let nav = BaseNavigationViewController.init(rootViewController: vc)
nav.modalPresentationStyle = .fullScreen
keyWindow.rootViewController?.present(nav, animated: true, completion: nil)
}else if type == 1 {
TRTCCloud.sharedInstance().exitRoom()
TRTCCloud.sharedInstance().muteAllRemoteAudio(false)
TRTCCloud.sharedInstance().muteLocalAudio(false)
RoomVCViewModel.roomVM.isMute = true
NIMSDK.shared().chatroomManager.exitChatroom(self.roomInfo?.roomId ?? "")
self.dismiss(animated: true, completion: nil)
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
let vc = RoomVC(roomUid: uid)
let nav = BaseNavigationViewController.init(rootViewController: vc)
nav.modalPresentationStyle = .fullScreen
keyWindow.rootViewController?.present(nav, animated: true, completion: nil)
}
}else{
let web = WebViewController(url: uid,isHalf: true)
self.present(web, animated: true, completion: nil)
}
}
}
private func addNIMSDKManager(){
@@ -102,7 +112,27 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol {
make.bottom.equalTo(-bottom)
make.height.equalTo(UIDevice.scaleWidth(width: 40))
}
micSeatView.showUserInfoBlock = {[weak self] user in
guard let weakSelf = self else { return }
let userInfoView:HomeVoiceUserInfoView = HomeVoiceUserInfoView.init(frame: .zero)
userInfoView.clickBtnBlock = {[weak self] (type,uid) in
guard let weakSelf = self else {
return
}
if type == 0{
let session = NIMSession(uid, type: .P2P)
let chatVC = ChatVC.init(session: session)
weakSelf.navigationController?.pushViewController(chatVC, animated: true)
}
}
userInfoView.type = 2
userInfoView.user = user
weakSelf.view.addSubview(userInfoView)
userInfoView.snp.makeConstraints { make in
make.edges.equalTo(weakSelf.view)
}
}
}
private func requestData(){

View File

@@ -9,8 +9,11 @@ import UIKit
import NIMSDK
import MJExtension
class NormalMicSeatSuperView: MicSeatSuperView {
typealias ShowUserInfoBlock = (_ user:UserObject)->Void
class NormalMicSeatSuperView: MicSeatSuperView {
var showUserInfoBlock:ShowUserInfoBlock?
override init(frame: CGRect) {
super.init(frame: frame)
setUILayout()
@@ -127,20 +130,20 @@ class NormalMicSeatSuperView: MicSeatSuperView {
let params = TRTCAudioVolumeEvaluateParams()
params.interval = 900
cloud.enableAudioVolumeEvaluation(true, with: params)
let mewParams = TRTCParams()
let yinParams = TRTCParams()
if AuthViewModel.authVM.appId.isEmpty{
mewParams.sdkAppId = UInt32("1400798783") ?? 0
yinParams.sdkAppId = UInt32("1400798783") ?? 0
}else{
mewParams.sdkAppId = UInt32(AuthViewModel.authVM.appId) ?? 0
yinParams.sdkAppId = UInt32(AuthViewModel.authVM.appId) ?? 0
}
mewParams.roomId = UInt32(curRoomId) ?? 0
yinParams.roomId = UInt32(curRoomId) ?? 0
let uid = "\(AuthManager.userUid)"
mewParams.userId = uid
yinParams.userId = uid
let sign = self.roomData?.trtcSig ?? ""
mewParams.userSig = sign
mewParams.role = TRTCRoleType.audience
TRTCCloud.sharedInstance().enterRoom(mewParams, appScene: TRTCAppScene.LIVE)
yinParams.userSig = sign
yinParams.role = TRTCRoleType.audience
TRTCCloud.sharedInstance().enterRoom(yinParams, appScene: TRTCAppScene.LIVE)
TRTCCloud.sharedInstance().muteAllRemoteAudio(false)
TRTCCloud.sharedInstance().muteLocalAudio(false)
RoomVCViewModel.roomVM.isMute = false
@@ -235,28 +238,27 @@ extension NormalMicSeatSuperView:UICollectionViewDelegate,UICollectionViewDataSo
}
if user.user != nil{
if user.user?.uid == AuthManager.userUid{
let popUpView = PlanetStarPopUpView.init(frame: CGRect(x: 0, y: 0, width: ScreenWidth, height: ScreenHeight))
let popUpView = PlanetStarPopUpView(frame: CGRect(x: 0, y: 0, width: ScreenWidth, height: ScreenHeight))
keyWindow.addSubview(popUpView)
popUpView.textView.text = "确定下麦旁听吗?"
popUpView.senderView.setTitle("确定", for: .normal)
popUpView.bgPointView.isHidden = true
popUpView.pointTextView.isHidden = true
popUpView.clickSendBlcok = {[weak self] in
popUpView.clickSendBlcok = {
let downRequest = NIMChatroomQueueRemoveRequest()
downRequest.key = "\(indexPath.row)"
downRequest.roomId = roomUid
NIMSDK.shared().chatroomManager.removeChatroomQueueObject(downRequest) {[weak self] (error, info) in
guard let self = self else{return}
if error == nil{
}
NIMSDK.shared().chatroomManager.removeChatroomQueueObject(downRequest) { (error, info) in
}
}
return
}
if let showUserInfoBlock = self.showUserInfoBlock,let user = user.user{
showUserInfoBlock(user)
}
HUDTool.show(with: "该麦位已经有人了哦~")
}else{
if (index == -2){
upMicAction(index: "\(indexPath.row)")
@@ -299,9 +301,10 @@ extension NormalMicSeatSuperView:UICollectionViewDelegate,UICollectionViewDataSo
user.user = userData
}else if changeType == 2,let i = Int(pos){
let user = roomUserList[i]
let cell = collectionView.cellForItem(at: IndexPath(row: i, section: 0)) as! NormalMicSeatCell
cell.micSeatView.speakView.isHidden = true
user.user = nil
if let cell = collectionView.cellForItem(at: IndexPath(row: i, section: 0)) as? NormalMicSeatCell{
cell.micSeatView.speakView.isHidden = true
user.user = nil
}
}
}
@@ -393,9 +396,11 @@ extension NormalMicSeatSuperView:TRTCCloudDelegate{
}
roomOwnerView.speakView.isHidden = true
for i in 0..<8 {
let cell = collectionView.cellForItem(at: IndexPath(row: i, section: 0)) as! NormalMicSeatCell
if let cell = collectionView.cellForItem(at: IndexPath(row: i, section: 0)) as? NormalMicSeatCell{
cell.micSeatView.speakView.isHidden = true
}
}
for uid in uidList {
@@ -409,11 +414,12 @@ extension NormalMicSeatSuperView:TRTCCloudDelegate{
}
for i in 0..<8 {
let cell = collectionView.cellForItem(at: IndexPath(row: i, section: 0)) as! NormalMicSeatCell
if let user = cell.user,let curUid = user.uid,"\(curUid)" == uid{
cell.micSeatView.speakView.isHidden = false
}else{
cell.micSeatView.speakView.isHidden = true
if let cell = collectionView.cellForItem(at: IndexPath(row: i, section: 0)) as? NormalMicSeatCell{
if let user = cell.user,let curUid = user.uid,"\(curUid)" == uid{
cell.micSeatView.speakView.isHidden = false
}else{
cell.micSeatView.speakView.isHidden = true
}
}
}
}

View File

@@ -25,6 +25,7 @@ class RoomMenuView: UIView {
addSubview(sendBtn)
addSubview(chatBtn)
addSubview(micBtn)
addSubview(sendGiftBtn)
sendBtn.snp.makeConstraints { make in
make.leading.equalTo(UIDevice.scaleWidth(width: 15))
make.top.equalTo(self)
@@ -42,7 +43,11 @@ class RoomMenuView: UIView {
make.centerY.equalTo(chatBtn)
make.leading.equalTo(chatBtn.snp.trailing).offset((UIDevice.scaleWidth(width: 8)))
}
sendGiftBtn.snp.makeConstraints { make in
make.trailing.equalTo(-UIDevice.scaleWidth(width: 15))
make.width.height.equalTo(UIDevice.scaleWidth(width: 38))
make.centerY.equalTo(chatBtn)
}
}
@@ -163,9 +168,9 @@ class RoomMenuView: UIView {
_micBtn.isHidden = true
return _micBtn
}()
// private lazy var sendGiftBtn :UIButton = {
// let _sendGiftBtn = UIButton()
// _sendGiftBtn.setImage(UIImage(named: room_send_gift_icon), for: .normal)
// return _sendGiftBtn
// }()
private lazy var sendGiftBtn :UIButton = {
let _sendGiftBtn = UIButton()
_sendGiftBtn.setImage(UIImage(named: "room_send_gift_icon"), for: .normal)
return _sendGiftBtn
}()
}

View File

@@ -0,0 +1,26 @@
//
// YinRoomRankModel.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/22.
//
import UIKit
import HandyJSON
struct YinRoomRankModel: HandyJSON{
var avatar = ""
var charmSeq = 0
var charmUrl = ""
var experNewUrl = ""
var charmNewUrl = ""
var erbanNo = 0
var experSeq = 0
var experUrl = ""
var gender:UserSexType = .Boy
var goldAmount = 0
var hide = false
var nick = ""
var ranking = 0
var uid = 0
}

View File

@@ -0,0 +1,18 @@
//
// SendGiftUserModel.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/14.
//
import UIKit
import HandyJSON
struct SendGiftUserModel: HandyJSON{
var avatar = ""
var nick = ""
var position = ""
var vipMic = false
var isChoose = false
var uid = 0
}

View File

@@ -0,0 +1,46 @@
//
// SendGiftFaceplateView.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/14.
//
import UIKit
class SendGiftFaceplateView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setUILayout()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setUILayout(){
addSubview(dissBtn)
addSubview(bgMaskView)
addSubview(contentStackView)
}
//MARK: -
private lazy var dissBtn:UIButton = {
let _dissBtn = UIButton()
return _dissBtn
}()
private lazy var bgMaskView:UIVisualEffectView = {
let blur = UIBlurEffect(style: .dark)
let _bgMaskView = UIVisualEffectView(effect: blur)
return _bgMaskView
}()
private lazy var contentStackView:UIStackView = {
let _contentStackView = UIStackView()
_contentStackView.axis = .vertical
_contentStackView.distribution = .fill
_contentStackView.alignment = .fill
_contentStackView.spacing = 0
_contentStackView.backgroundColor = .clear
return _contentStackView
}()
}

View File

@@ -0,0 +1,46 @@
//
// SendGiftTopView.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/14.
//
import UIKit
class SendGiftTopView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setUILayout()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setUILayout(){
addSubview(giftBtn)
addSubview(lineView)
giftBtn.snp.makeConstraints { make in
make.leading.equalTo(UIDevice.scaleWidth(width: 16))
make.centerY.equalTo(self)
make.width.equalTo(UIDevice.scaleWidth(width: 40))
}
lineView.snp.makeConstraints { make in
make.height.equalTo(1)
make.leading.trailing.bottom.equalTo(self)
}
}
//MARK: -
private lazy var giftBtn:UIButton = {
let _giftBtn = UIButton.getCustomBtn(text: "送礼",font: UIFont.getScaleFont(ofSize: 14, weight: .semibold),color: ThemeColor(hexStr: "#878B9C"),selectedColor: .white)
_giftBtn.isSelected = true
return _giftBtn
}()
private lazy var lineView:UIView = {
let _lineView = UIView()
_lineView.backgroundColor = ThemeColor(hexStr: "#FFFFFF", alpha: 0.1)
return _lineView
}()
}

View File

@@ -0,0 +1,71 @@
//
// SendGiftUserCell.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/14.
//
import UIKit
import Nuke
class SendGiftUserCell: UICollectionViewCell {
override init(frame: CGRect) {
super.init(frame: frame)
setUILayout()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setUILayout(){
contentView.addSubview(avatarView)
contentView.addSubview(bgBackgroundView)
contentView.addSubview(numView)
avatarView.snp.makeConstraints { make in
make.centerX.top.equalTo(contentView)
make.width.height.equalTo(UIDevice.scaleWidth(width: 38))
}
bgBackgroundView.snp.makeConstraints { make in
make.edges.equalTo(avatarView)
}
numView.snp.makeConstraints { make in
make.height.equalTo(UIDevice.scaleWidth(width: 10))
make.centerY.equalTo(avatarView.snp.bottom)
make.centerX.equalTo(avatarView)
}
}
//MARK: -
var model:SendGiftUserModel? = nil{
didSet{
guard let _model = model else { return}
if let position = Int(_model.position){
numView.text = position == -1 ? "房主" : "\(position + 1)"
}
Nuke.loadImage(with: _model.avatar, into: avatarView, completion: nil)
avatarView.layer.borderWidth = _model.isChoose ? 2 : 0
bgBackgroundView.isHidden = _model.isChoose
numView.backgroundColor = _model.isChoose ? ThemeColor(hexStr: "#FFE710"):ThemeColor(hexStr: "#BDBFD0")
numView.textColor = _model.isChoose ? ThemeColor(hexStr: "#282828"):.white
}
}
private lazy var avatarView:UIImageView = {
let _avatarView = UIImageView()
_avatarView.layer.masksToBounds = true
_avatarView.layer.cornerRadius = UIDevice.scaleWidth(width: 38)/2
_avatarView.layer.borderColor = ThemeColor(hexStr: "#FFE710").cgColor
return _avatarView
}()
private lazy var bgBackgroundView:UIView = {
let _backgroundView = UIView()
_backgroundView.backgroundColor = UIColor(white: 0, alpha: 0.2)
_backgroundView.layer.cornerRadius = UIDevice.scaleWidth(width: 38)/2
_backgroundView.layer.masksToBounds = true
return _backgroundView
}()
private lazy var numView:UILabel = {
let _numView = UILabel.getCustomLabel(font: UIFont.getScaleFont(ofSize: 8, weight: .regular),color: .white,textAlignment: .center,backgroundColor: ThemeColor(hexStr: "#999999"),masksToBounds: true,cornerRadius: UIDevice.scaleWidth(width: 10)/2)
return _numView
}()
}

View File

@@ -0,0 +1,46 @@
//
// SendGiftUserView.swift
// yinmeng-ios
//
// Created by duoban on 2024/3/14.
//
import UIKit
class SendGiftUserView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setUILayout()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setUILayout(){
}
//MARK: -
private lazy var textVeiw:UILabel = {
let _textView = UILabel.getCustomLabel(text: "送给",font: UIFont.getScaleFont(ofSize: 13, weight: .medium),color: .white,textAlignment: .center)
return _textView
}()
private lazy var allUserBtn:UIButton = {
let normalImage = UIImage.image(color: ThemeColor(hexStr: "#878B9C"))
let selectedImage = UIImage.image(color: ThemeColor(hexStr: "#FFE710"))
let _allUserBtn = UIButton.getCustomBtn(text: "全选",font: UIFont.getScaleFont(ofSize: 13, weight: .medium),color: .white,selectedColor: ThemeColor(hexStr: "#28282"),bgImage: normalImage,selectedBgImage: selectedImage)
_allUserBtn.layer.cornerRadius = UIDevice.scaleWidth(width: 18)/2
_allUserBtn.layer.masksToBounds = true
return _allUserBtn
}()
private lazy var collectionView:UICollectionView = {
let flowLayout = UICollectionViewFlowLayout()
flowLayout.scrollDirection = .horizontal
flowLayout.itemSize = CGSize(width: UIDevice.scaleWidth(width: 38), height: UIDevice.scaleWidth(width: 43))
let _collectionView = UICollectionView()
return _collectionView
}()
}

View File

@@ -23,8 +23,8 @@ struct UserFunctionItem {
}
struct UserObject: HandyJSON {
var birth:Int64 = 0
var userDesc = ""
var uid:Int? = 0
var erbanNo:Int? = 0
var avatar:String? = ""
@@ -35,6 +35,8 @@ struct UserObject: HandyJSON {
var phone:String? = ""
var giftValue:Int64 = 0
var userLevelVo:userLevelModel?
var userVoice = ""
var voiceDura = ""
}
struct userLevelModel:HandyJSON{