Commit 24796ab2a73dfdfbfa02d6701d100c2b9add3b24

Authored by 张旭
1 parent 8ba7d542

首页支持 短剧 , 课程 区块

metaCode/Classes/Main/HomePage/Controller/DownSlideController/CNSlideBaseNavigationController.swift
@@ -10,6 +10,18 @@ import Foundation @@ -10,6 +10,18 @@ import Foundation
10 class CNSlideBaseNavigationController: UINavigationController 10 class CNSlideBaseNavigationController: UINavigationController
11 ,UIViewControllerTransitioningDelegate { 11 ,UIViewControllerTransitioningDelegate {
12 var dismissClosure: (()->())? 12 var dismissClosure: (()->())?
  13 + var cellType:CNLiveHomePageCellType = .course
  14 +
  15 + init(rootViewController: UIViewController,cellType:CNLiveHomePageCellType) {
  16 + super.init(rootViewController: rootViewController)
  17 + self.cellType = cellType
  18 +
  19 + }
  20 +
  21 + required init?(coder aDecoder: NSCoder) {
  22 + fatalError("init(coder:) has not been implemented")
  23 + }
  24 +
13 override func viewDidLoad() { 25 override func viewDidLoad() {
14 super.viewDidLoad() 26 super.viewDidLoad()
15 modalPresentationStyle = .custom 27 modalPresentationStyle = .custom
@@ -17,11 +29,11 @@ class CNSlideBaseNavigationController: UINavigationController @@ -17,11 +29,11 @@ class CNSlideBaseNavigationController: UINavigationController
17 } 29 }
18 30
19 func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 31 func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
20 - return CNUpSlideAnimationTransition(animationType: .present) 32 + return CNUpSlideAnimationTransition(animationType: .present, cellType: self.cellType)
21 } 33 }
22 34
23 func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 35 func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
24 - return CNUpSlideAnimationTransition(animationType: .dismiss) 36 + return CNUpSlideAnimationTransition(animationType: .dismiss, cellType: self.cellType)
25 } 37 }
26 38
27 func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { 39 func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
metaCode/Classes/Main/HomePage/Controller/DownSlideController/CNUpSlideDetailViewController.swift
@@ -3,11 +3,24 @@ @@ -3,11 +3,24 @@
3 // metaCode 3 // metaCode
4 // 4 //
5 // Created by zx on 2023/10/16. 5 // Created by zx on 2023/10/16.
6 -// 下滑页原生页--大图点击详情页 6 +// 下滑页原生页--课程 大图点击详情页
  7 +// 首页原生页--短剧 大图详情页
7 8
8 import Foundation 9 import Foundation
  10 +import MJRefresh
  11 +import EmptyDataSet_Swift
9 12
10 -class CNUpSlideDetailViewController: CNLiveBaseViewController { 13 +///首页课程或短剧类型
  14 +enum CNLiveHomePageCellType {
  15 + ///课程控制器->课程
  16 + case course
  17 + ///短剧控制器->短剧
  18 + case playlet
  19 + ///短剧控制器->课程
  20 + case playletToCourse
  21 +}
  22 +
  23 +class CNUpSlideDetailViewController: CNLiveBaseViewController,UITableViewDataSource, UITableViewDelegate,EmptyDataSetSource, EmptyDataSetDelegate {
11 24
12 //slideModel 25 //slideModel
13 var _slideModel : CNLiveDownSlideModel? 26 var _slideModel : CNLiveDownSlideModel?
@@ -20,6 +33,8 @@ class CNUpSlideDetailViewController: CNLiveBaseViewController { @@ -20,6 +33,8 @@ class CNUpSlideDetailViewController: CNLiveBaseViewController {
20 } 33 }
21 } 34 }
22 35
  36 + var cellType: CNLiveHomePageCellType = .course
  37 +
23 var dismissClosure: (()->())? 38 var dismissClosure: (()->())?
24 //the point when start to interactive 39 //the point when start to interactive
25 var interactiveStartingPoint: CGPoint? = nil 40 var interactiveStartingPoint: CGPoint? = nil
@@ -54,7 +69,9 @@ class CNUpSlideDetailViewController: CNLiveBaseViewController { @@ -54,7 +69,9 @@ class CNUpSlideDetailViewController: CNLiveBaseViewController {
54 return btn 69 return btn
55 }() 70 }()
56 71
57 - init(cell: CNDownSlideSingleCourseCell,slideModel:CNLiveDownSlideModel) { 72 + init(cell: CNDownSlideSingleCourseCell,slideModel:CNLiveDownSlideModel,cellType:CNLiveHomePageCellType) {
  73 + self.cellType = cellType
  74 + self.pageNum = 1
58 self.cell = cell 75 self.cell = cell
59 super.init(nibName: nil, bundle: nil) 76 super.init(nibName: nil, bundle: nil)
60 self.slideModel = slideModel 77 self.slideModel = slideModel
@@ -75,12 +92,20 @@ class CNUpSlideDetailViewController: CNLiveBaseViewController { @@ -75,12 +92,20 @@ class CNUpSlideDetailViewController: CNLiveBaseViewController {
75 super.viewDidLoad() 92 super.viewDidLoad()
76 setupUI() 93 setupUI()
77 getImageFromCell() 94 getImageFromCell()
  95 + if self.cellType == .playlet{
  96 + self.getBlockContents(page: 1)
  97 + }
78 } 98 }
79 99
80 private func setupUI() { 100 private func setupUI() {
81 self.view.layer.masksToBounds = true 101 self.view.layer.masksToBounds = true
82 - view.addSubview(scrollView)  
83 - scrollView.slideModel = _slideModel 102 + if self.cellType == .playlet{
  103 + self.view.addSubview(self.tableView)
  104 + self.tableView.frame = CGRect(x: 0, y: 0, width: KSreenWidth, height: KSreenHeight)
  105 + }else{
  106 + view.addSubview(scrollView)
  107 + scrollView.slideModel = _slideModel
  108 + }
84 view.addSubview(closeBtn) 109 view.addSubview(closeBtn)
85 view.addGestureRecognizer(dismissPanGesture) 110 view.addGestureRecognizer(dismissPanGesture)
86 111
@@ -128,7 +153,6 @@ class CNUpSlideDetailViewController: CNLiveBaseViewController { @@ -128,7 +153,6 @@ class CNUpSlideDetailViewController: CNLiveBaseViewController {
128 dismiss(animated: true, completion: nil) 153 dismiss(animated: true, completion: nil)
129 let nav = self.navigationController as! CNSlideBaseNavigationController 154 let nav = self.navigationController as! CNSlideBaseNavigationController
130 nav.dismissClosure?() 155 nav.dismissClosure?()
131 -// dismissClosure?()  
132 stopDismissPanGesture(gesture) 156 stopDismissPanGesture(gesture)
133 return 157 return
134 } 158 }
@@ -160,17 +184,132 @@ class CNUpSlideDetailViewController: CNLiveBaseViewController { @@ -160,17 +184,132 @@ class CNUpSlideDetailViewController: CNLiveBaseViewController {
160 gesture.view?.transform = CGAffineTransform.identity 184 gesture.view?.transform = CGAffineTransform.identity
161 } 185 }
162 } 186 }
  187 +
  188 + // MARK: - 短剧cell列表详情页
  189 + let kCNLiveAlbumImageCellIdentifier = "kCNLiveAlbumImageCellIdentifier"
  190 + let kCNLiveAlbumCellIdentifier = "kCNLiveAlbumCellIdentifier"
  191 +
  192 + var pageNum: NSInteger
  193 + var network_type: CNLiveMineResponseType!
  194 + // MARK: - 懒加载
  195 + ///数据源
  196 + lazy var dataArray: NSMutableArray = {
  197 + var dataArray = NSMutableArray()
  198 + return dataArray
  199 + }()
  200 + lazy var tableView : UITableView = {
  201 + let tableView = UITableView(frame: .zero, style: .plain)
  202 + tableView.dataSource = self
  203 + tableView.delegate = self
  204 + tableView.emptyDataSetSource = self
  205 + tableView.emptyDataSetDelegate = self
  206 + tableView.separatorStyle = .none
  207 + tableView.tableFooterView = UIView.init()
  208 + tableView.register(CNLiveAlbumCell.self, forCellReuseIdentifier: kCNLiveAlbumCellIdentifier)
  209 + tableView.register(CNLiveAlbumImageCell.self, forCellReuseIdentifier: kCNLiveAlbumImageCellIdentifier)
  210 + return tableView
  211 + }()
  212 +
  213 +
  214 + func numberOfSections(in tableView: UITableView) -> Int {
  215 + 2
  216 + }
  217 + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  218 + if section == 0{
  219 + return 1
  220 + }else{
  221 + return self.dataArray.count
  222 + }
  223 + }
  224 +
  225 + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  226 +
  227 + if indexPath.section == 0{
  228 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveAlbumImageCellIdentifier) as? CNLiveAlbumImageCell
  229 + else {
  230 + let cell = CNLiveAlbumImageCell()
  231 + return cell
  232 + }
  233 + cell.iconImgView.image = self.cell.bgImageView.image
  234 + return cell
  235 + }else{
  236 + let albumModel = self.dataArray[indexPath.row] as! CNLiveAlbumModel
  237 +
  238 + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveAlbumCellIdentifier) as? CNLiveAlbumCell
  239 + else {
  240 + let cell = CNLiveAlbumCell()
  241 + return cell
  242 + }
  243 + cell.albumModel = albumModel
  244 + return cell
  245 + }
  246 + }
  247 + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  248 + if indexPath.section == 0{
  249 + return KSreenWidth
  250 + }else{
  251 + return 75
  252 + }
  253 + }
  254 +
  255 + // MARK: - 获取全部专辑列表
  256 + func getBlockContents(page:NSInteger){
  257 + showLoading(message: "")
  258 + CNLiveHomePageViewModel.getBlockContents(blockId: self.slideModel!.blockId ?? "", page: page) {[weak self] result, status in
  259 + hiddenLoading()
  260 + if status == .success{
  261 + if self!.pageNum > 1 {
  262 + self!.dataArray.addObjects(from: result as! [CNLiveAlbumModel])
  263 + }
  264 + if self!.pageNum == 1 {
  265 + self!.dataArray.removeAllObjects()
  266 + self!.dataArray.addObjects(from: result as! [CNLiveAlbumModel])
  267 + if self!.dataArray.count > 0 && self!.tableView.mj_header == nil && self!.tableView.mj_footer == nil {
  268 + self!.addRefreshView()
  269 + self!.pageNum = self!.pageNum + 1
  270 + self!.getBlockContents(page: self!.pageNum)
  271 + }
  272 + }
  273 +
  274 + self!.tableView.mj_header?.endRefreshing()
  275 + self!.tableView.mj_footer?.endRefreshing()
  276 + self!.tableView.reloadData()
  277 + if (result as! Array<Any>).count == 0 {
  278 + self!.tableView.mj_footer?.endRefreshingWithNoMoreData()
  279 + self!.tableView.reloadData()
  280 + }
  281 +
  282 + }else if (status == .noNetwork) {
  283 + self!.network_type = .noNetwork
  284 + self!.tableView.reloadEmptyDataSet()
  285 + } else {
  286 + self!.network_type = .failed
  287 + self!.tableView.reloadEmptyDataSet()
  288 + }
  289 + }
  290 + }
  291 + func addRefreshView() {
  292 + tableView.mj_header = MJRefreshNormalHeader.init(refreshingBlock: {[weak self] in
  293 + self!.pageNum = 1
  294 + self!.getBlockContents(page: 1)
  295 + })
  296 +
  297 + tableView.mj_footer = MJRefreshAutoNormalFooter.init(refreshingBlock: {[weak self] in
  298 + self!.pageNum = self!.pageNum + 1
  299 + self!.getBlockContents(page: self!.pageNum)
  300 + })
  301 + }
163 302
164 } 303 }
165 304
166 extension CNUpSlideDetailViewController: UIViewControllerTransitioningDelegate { 305 extension CNUpSlideDetailViewController: UIViewControllerTransitioningDelegate {
167 306
168 func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 307 func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
169 - return CNUpSlideAnimationTransition(animationType: .present) 308 + return CNUpSlideAnimationTransition(animationType: .present, cellType: self.cellType)
170 } 309 }
171 310
172 func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 311 func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
173 - return CNUpSlideAnimationTransition(animationType: .dismiss) 312 + return CNUpSlideAnimationTransition(animationType: .dismiss, cellType: self.cellType)
174 } 313 }
175 314
176 func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { 315 func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
@@ -193,3 +332,48 @@ extension CNUpSlideDetailViewController: UIGestureRecognizerDelegate { @@ -193,3 +332,48 @@ extension CNUpSlideDetailViewController: UIGestureRecognizerDelegate {
193 return true 332 return true
194 } 333 }
195 } 334 }
  335 +
  336 +extension CNUpSlideDetailViewController {
  337 +
  338 + func image(forEmptyDataSet scrollView: UIScrollView) -> UIImage? {
  339 + if network_type == .failed || network_type == .unkonw {
  340 + return UIImage(named: "mine_list_source_unusual_failed")
  341 + }
  342 + if dataArray.count == 0 {
  343 + return UIImage(named: "mine_list_source_unusual_empty")
  344 + }
  345 + if network_type == .noNetwork {
  346 + return UIImage(named: "mine_list_source_unusual_noNet")
  347 + }
  348 + return UIImage(named: "mine_list_source_unusual_empty")
  349 + }
  350 +
  351 + func title(forEmptyDataSet scrollView: UIScrollView) -> NSAttributedString? {
  352 + var defult_string = ""
  353 + if network_type == .failed || network_type == .unkonw {
  354 + defult_string = "接口请求错误,刷新试试~"
  355 + }
  356 + if network_type == .noNetwork {
  357 + defult_string = "网络开小差了,刷新试试~"
  358 + }
  359 + if dataArray.count == 0 {
  360 + defult_string = "暂时没有数据~"
  361 + }
  362 + return NSAttributedString(string: defult_string, attributes: [.font: Font_17,.foregroundColor: HexColor("#666666")!])
  363 + }
  364 +
  365 + func buttonTitle(forEmptyDataSet scrollView: UIScrollView, for state: UIControl.State) -> NSAttributedString? {
  366 + if network_type == .failed || network_type == .noNetwork {
  367 + let attributes = [NSAttributedString.Key.font:Font_16_Fit,
  368 + NSAttributedString.Key.foregroundColor: HexColor("#609BFF")]
  369 + return NSAttributedString(string: "刷一刷", attributes: attributes as [NSAttributedString.Key : Any])
  370 + }
  371 + return nil
  372 + }
  373 +
  374 + func emptyDataSet(_ scrollView: UIScrollView, didTapView view: UIView) {
  375 + if network_type == .failed || network_type == .noNetwork {
  376 + getBlockContents(page: 1)
  377 + }
  378 + }
  379 +}
metaCode/Classes/Main/HomePage/Controller/DownSlideController/CNUpSlideViewController.swift
@@ -160,6 +160,19 @@ class CNUpSlideViewController: CNLiveBaseViewController,UITableViewDelegate,UITa @@ -160,6 +160,19 @@ class CNUpSlideViewController: CNLiveBaseViewController,UITableViewDelegate,UITa
160 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 160 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
161 161
162 let slideModel = self.dataArray[indexPath.row] as! CNLiveDownSlideModel 162 let slideModel = self.dataArray[indexPath.row] as! CNLiveDownSlideModel
  163 + var cellType:CNLiveHomePageCellType = .course
  164 + ///model
  165 + ///(1) 1,2时跳转:sharelUrl后面拼接 ?contentId=contentId&videoId=pid
  166 + ///(2) 3,4时跳转:thirdUrl
  167 + ///(3)“album”,“album_video”,“album_ugc” -> http://wjjh5.cnlive.com/cnYmAlbumVideoList.html?aid=contentId&title=titlle
  168 + if slideModel.contents.first?.model ?? "0" == "1" || slideModel.contents.first?.model ?? "0" == "2" || slideModel.contents.first?.model ?? "0" == "3" || slideModel.contents.first?.model ?? "0" == "4"{
  169 + cellType = .course
  170 + }else if slideModel.contents.first?.model ?? "0" == "album_ugc"{
  171 + cellType = .playlet
  172 + }else{
  173 + //新类型
  174 + }
  175 +
163 //type=4一排两个 推荐课程&推荐活动; 74今日推荐; 12列表全部课程; 75单课程大图 176 //type=4一排两个 推荐课程&推荐活动; 74今日推荐; 12列表全部课程; 75单课程大图
164 if slideModel.type == SlideModelTypeRecommend4{ 177 if slideModel.type == SlideModelTypeRecommend4{
165 178
@@ -168,7 +181,7 @@ class CNUpSlideViewController: CNLiveBaseViewController,UITableViewDelegate,UITa @@ -168,7 +181,7 @@ class CNUpSlideViewController: CNLiveBaseViewController,UITableViewDelegate,UITa
168 }else if slideModel.type == SlideModelTypeAllCourse12{ 181 }else if slideModel.type == SlideModelTypeAllCourse12{
169 guard let cell = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return } 182 guard let cell = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return }
170 selectedCell = cell 183 selectedCell = cell
171 - let detailVC = CNSlideBaseNavigationController(rootViewController: CNUpSlideDetailViewController(cell: cell,slideModel: slideModel)) 184 + let detailVC = CNSlideBaseNavigationController(rootViewController: CNUpSlideDetailViewController(cell: cell,slideModel: slideModel, cellType: cellType), cellType: cellType)
172 detailVC.dismissClosure = { [weak self] in 185 detailVC.dismissClosure = { [weak self] in
173 guard let StrongSelf = self else { return } 186 guard let StrongSelf = self else { return }
174 StrongSelf.updateStatusBarAndTabbarFrame(visible: true) 187 StrongSelf.updateStatusBarAndTabbarFrame(visible: true)
@@ -180,7 +193,7 @@ class CNUpSlideViewController: CNLiveBaseViewController,UITableViewDelegate,UITa @@ -180,7 +193,7 @@ class CNUpSlideViewController: CNLiveBaseViewController,UITableViewDelegate,UITa
180 guard let cell = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return } 193 guard let cell = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return }
181 selectedCell = cell 194 selectedCell = cell
182 195
183 - let detailVC = CNSlideBaseNavigationController(rootViewController: CNUpSlideDetailViewController(cell: cell,slideModel: slideModel)) 196 + let detailVC = CNSlideBaseNavigationController(rootViewController: CNUpSlideDetailViewController(cell: cell,slideModel: slideModel, cellType: cellType), cellType: cellType)
184 197
185 detailVC.dismissClosure = { [weak self] in 198 detailVC.dismissClosure = { [weak self] in
186 guard let StrongSelf = self else { return } 199 guard let StrongSelf = self else { return }
metaCode/Classes/Main/HomePages/Controller/AuthController/CNLiveAuthViewController.swift
@@ -213,6 +213,19 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa @@ -213,6 +213,19 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa
213 }else{ 213 }else{
214 214
215 let slideModel = self.dataArray[indexPath.row] as! CNLiveDownSlideModel 215 let slideModel = self.dataArray[indexPath.row] as! CNLiveDownSlideModel
  216 + var cellType:CNLiveHomePageCellType = .course
  217 + ///model
  218 + ///(1) 1,2时跳转:sharelUrl后面拼接 ?contentId=contentId&videoId=pid
  219 + ///(2) 3,4时跳转:thirdUrl
  220 + ///(3)“album”,“album_video”,“album_ugc” -> http://wjjh5.cnlive.com/cnYmAlbumVideoList.html?aid=contentId&title=titlle
  221 + if slideModel.contents.first?.model ?? "0" == "1" || slideModel.contents.first?.model ?? "0" == "2" || slideModel.contents.first?.model ?? "0" == "3" || slideModel.contents.first?.model ?? "0" == "4"{
  222 + cellType = .playletToCourse
  223 + }else if slideModel.contents.first?.model ?? "0" == "album_ugc"{
  224 + cellType = .playlet
  225 + }else{
  226 + //新类型
  227 + }
  228 +
216 //type=4一排两个 推荐课程&推荐活动; 74今日推荐; 12列表全部课程; 75单课程大图 229 //type=4一排两个 推荐课程&推荐活动; 74今日推荐; 12列表全部课程; 75单课程大图
217 if slideModel.type == SlideModelTypeRecommend4{ 230 if slideModel.type == SlideModelTypeRecommend4{
218 231
@@ -221,7 +234,8 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa @@ -221,7 +234,8 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa
221 }else if slideModel.type == SlideModelTypeAllCourse12{ 234 }else if slideModel.type == SlideModelTypeAllCourse12{
222 guard let cell = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return } 235 guard let cell = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return }
223 selectedCell = cell 236 selectedCell = cell
224 - let detailVC = CNHomePageBaseNavigationController(rootViewController: CNHomepageDetailViewController(cell: cell,slideModel: slideModel)) 237 +
  238 + let detailVC = CNSlideBaseNavigationController(rootViewController: CNUpSlideDetailViewController(cell: cell,slideModel: slideModel, cellType: cellType), cellType: cellType)
225 detailVC.dismissClosure = { [weak self] in 239 detailVC.dismissClosure = { [weak self] in
226 guard let StrongSelf = self else { return } 240 guard let StrongSelf = self else { return }
227 StrongSelf.updateStatusBarAndTabbarFrame(visible: true) 241 StrongSelf.updateStatusBarAndTabbarFrame(visible: true)
@@ -232,8 +246,7 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa @@ -232,8 +246,7 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa
232 }else if slideModel.type == SlideModelTypeOneCourse75{ 246 }else if slideModel.type == SlideModelTypeOneCourse75{
233 guard let cell = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return } 247 guard let cell = tableView.cellForRow(at: indexPath) as? CNDownSlideSingleCourseCell else { return }
234 selectedCell = cell 248 selectedCell = cell
235 -  
236 - let detailVC = CNHomePageBaseNavigationController(rootViewController:CNHomepageDetailViewController(cell: cell,slideModel: slideModel)) 249 + let detailVC = CNSlideBaseNavigationController(rootViewController: CNUpSlideDetailViewController(cell: cell,slideModel: slideModel, cellType: cellType), cellType: cellType)
237 250
238 detailVC.dismissClosure = { [weak self] in 251 detailVC.dismissClosure = { [weak self] in
239 guard let StrongSelf = self else { return } 252 guard let StrongSelf = self else { return }
@@ -318,7 +331,6 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa @@ -318,7 +331,6 @@ class CNLiveAuthViewController:CNLiveBaseViewController,UITableViewDelegate,UITa
318 // showLoading(message: "") 331 // showLoading(message: "")
319 CNLiveDownSlideViewModel.requestGetPage(pageId: pageID as NSString) { result, status in 332 CNLiveDownSlideViewModel.requestGetPage(pageId: pageID as NSString) { result, status in
320 hiddenLoading() 333 hiddenLoading()
321 -  
322 if status == .success{ 334 if status == .success{
323 self.dataArray.removeAllObjects() 335 self.dataArray.removeAllObjects()
324 let array = result as! [Any] 336 let array = result as! [Any]
metaCode/Classes/Main/HomePages/Controller/AuthController/push相关/CNHomepageDetailViewController.swift
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 // metaCode 3 // metaCode
4 // 4 //
5 // Created by zx on 2024/1/5. 5 // Created by zx on 2024/1/5.
6 -// 首页短剧--大图点击详情页 6 +// 首页--短剧大图点击详情页
7 7
8 import Foundation 8 import Foundation
9 import MJRefresh 9 import MJRefresh
@@ -11,30 +11,6 @@ import EmptyDataSet_Swift @@ -11,30 +11,6 @@ import EmptyDataSet_Swift
11 11
12 class CNHomepageDetailViewController: CNLiveBaseViewController ,UITableViewDataSource, UITableViewDelegate,EmptyDataSetSource, EmptyDataSetDelegate{ 12 class CNHomepageDetailViewController: CNLiveBaseViewController ,UITableViewDataSource, UITableViewDelegate,EmptyDataSetSource, EmptyDataSetDelegate{
13 13
14 - let kCNLiveAlbumImageCellIdentifier = "kCNLiveAlbumImageCellIdentifier"  
15 - let kCNLiveAlbumCellIdentifier = "kCNLiveAlbumCellIdentifier"  
16 -  
17 - var pageNum: NSInteger  
18 - var network_type: CNLiveMineResponseType!  
19 - // MARK: - 懒加载  
20 - ///数据源  
21 - lazy var dataArray: NSMutableArray = {  
22 - var dataArray = NSMutableArray()  
23 - return dataArray  
24 - }()  
25 - lazy var tableView : UITableView = {  
26 - let tableView = UITableView(frame: .zero, style: .plain)  
27 - tableView.dataSource = self  
28 - tableView.delegate = self  
29 - tableView.emptyDataSetSource = self  
30 - tableView.emptyDataSetDelegate = self  
31 - tableView.separatorStyle = .none  
32 - tableView.tableFooterView = UIView.init()  
33 - tableView.register(CNLiveAlbumCell.self, forCellReuseIdentifier: kCNLiveAlbumCellIdentifier)  
34 - tableView.register(CNLiveAlbumImageCell.self, forCellReuseIdentifier: kCNLiveAlbumImageCellIdentifier)  
35 - return tableView  
36 - }()  
37 -  
38 //slideModel 14 //slideModel
39 var _slideModel : CNLiveDownSlideModel? 15 var _slideModel : CNLiveDownSlideModel?
40 var slideModel : CNLiveDownSlideModel? { 16 var slideModel : CNLiveDownSlideModel? {
@@ -49,11 +25,9 @@ class CNHomepageDetailViewController: CNLiveBaseViewController ,UITableViewData @@ -49,11 +25,9 @@ class CNHomepageDetailViewController: CNLiveBaseViewController ,UITableViewData
49 var dismissClosure: (()->())? 25 var dismissClosure: (()->())?
50 //the point when start to interactive 26 //the point when start to interactive
51 var interactiveStartingPoint: CGPoint? = nil 27 var interactiveStartingPoint: CGPoint? = nil
52 -  
53 var draggingDownToDismiss = false 28 var draggingDownToDismiss = false
54 -  
55 let cell: CNDownSlideSingleCourseCell! 29 let cell: CNDownSlideSingleCourseCell!
56 - 30 +
57 private lazy var dismissPanGesture: UIPanGestureRecognizer = { 31 private lazy var dismissPanGesture: UIPanGestureRecognizer = {
58 let ges = UIPanGestureRecognizer() 32 let ges = UIPanGestureRecognizer()
59 ges.maximumNumberOfTouches = 1 33 ges.maximumNumberOfTouches = 1
@@ -79,7 +53,6 @@ class CNHomepageDetailViewController: CNLiveBaseViewController ,UITableViewData @@ -79,7 +53,6 @@ class CNHomepageDetailViewController: CNLiveBaseViewController ,UITableViewData
79 btn.addTarget(self, action: #selector(closeAction), for: .touchUpInside) 53 btn.addTarget(self, action: #selector(closeAction), for: .touchUpInside)
80 return btn 54 return btn
81 }() 55 }()
82 -  
83 init(cell: CNDownSlideSingleCourseCell,slideModel:CNLiveDownSlideModel) { 56 init(cell: CNDownSlideSingleCourseCell,slideModel:CNLiveDownSlideModel) {
84 self.pageNum = 1 57 self.pageNum = 1
85 self.cell = cell 58 self.cell = cell
@@ -98,7 +71,6 @@ class CNHomepageDetailViewController: CNLiveBaseViewController ,UITableViewData @@ -98,7 +71,6 @@ class CNHomepageDetailViewController: CNLiveBaseViewController ,UITableViewData
98 required init?(coder aDecoder: NSCoder) { 71 required init?(coder aDecoder: NSCoder) {
99 fatalError("init(coder:) has not been implemented") 72 fatalError("init(coder:) has not been implemented")
100 } 73 }
101 -  
102 override func viewDidLoad() { 74 override func viewDidLoad() {
103 super.viewDidLoad() 75 super.viewDidLoad()
104 setupUI() 76 setupUI()
@@ -125,12 +97,98 @@ class CNHomepageDetailViewController: CNLiveBaseViewController ,UITableViewData @@ -125,12 +97,98 @@ class CNHomepageDetailViewController: CNLiveBaseViewController ,UITableViewData
125 private func getImageFromCell() { 97 private func getImageFromCell() {
126 scrollView.imageView.image = cell.bgImageView.image 98 scrollView.imageView.image = cell.bgImageView.image
127 } 99 }
128 -  
129 @objc private func closeAction() { 100 @objc private func closeAction() {
130 dismiss(animated: true, completion: nil) 101 dismiss(animated: true, completion: nil)
131 let nav = self.navigationController as! CNHomePageBaseNavigationController 102 let nav = self.navigationController as! CNHomePageBaseNavigationController
132 nav.dismissClosure?() 103 nav.dismissClosure?()
133 } 104 }
  105 + @objc private func handleDismissPan(gesture: UIPanGestureRecognizer) {
  106 + if !draggingDownToDismiss {
  107 + return
  108 + }
  109 +
  110 + let startingPoint: CGPoint
  111 +
  112 + if let p = interactiveStartingPoint {
  113 + startingPoint = p
  114 + } else {
  115 + startingPoint = gesture.location(in: nil)
  116 + interactiveStartingPoint = startingPoint
  117 + }
  118 +
  119 + let currentLocation = gesture.location(in: nil)
  120 +
  121 + var progress = (currentLocation.y - startingPoint.y) / 100
  122 +
  123 + //prevent viewController bigger when scrolling up
  124 + if currentLocation.y <= startingPoint.y {
  125 + progress = 0
  126 + }
  127 +
  128 + if progress >= 1.0 {
  129 + dismiss(animated: true, completion: nil)
  130 + let nav = self.navigationController as! CNHomePageBaseNavigationController
  131 + nav.dismissClosure?()
  132 +// dismissClosure?()
  133 + stopDismissPanGesture(gesture)
  134 + return
  135 + }
  136 +
  137 + let targetShrinkScale: CGFloat = 0.86
  138 + let currentScale: CGFloat = 1 - (1 - targetShrinkScale) * progress
  139 +
  140 + switch gesture.state {
  141 + case .began,.changed:
  142 + scrollView.isScrollEnabled = false
  143 + gesture.view?.transform = CGAffineTransform(scaleX: currentScale, y: currentScale)
  144 + gesture.view?.layer.cornerRadius = GlobalConstants.toDayCardCornerRadius * (progress)
  145 + scrollView.showsVerticalScrollIndicator = false
  146 + case .cancelled,.ended:
  147 + scrollView.isScrollEnabled = true
  148 + stopDismissPanGesture(gesture)
  149 + default:
  150 + break
  151 + }
  152 + }
  153 +
  154 + //当下拉Offset超过100或取消下拉手势时,执行此方法
  155 + private func stopDismissPanGesture(_ gesture: UIPanGestureRecognizer) {
  156 + draggingDownToDismiss = false
  157 + interactiveStartingPoint = nil
  158 + scrollView.showsVerticalScrollIndicator = true
  159 +
  160 + UIView.animate(withDuration: 0.2) {
  161 + gesture.view?.transform = CGAffineTransform.identity
  162 + }
  163 + }
  164 +
  165 +
  166 +
  167 +
  168 + let kCNLiveAlbumImageCellIdentifier = "kCNLiveAlbumImageCellIdentifier"
  169 + let kCNLiveAlbumCellIdentifier = "kCNLiveAlbumCellIdentifier"
  170 +
  171 + var pageNum: NSInteger
  172 + var network_type: CNLiveMineResponseType!
  173 + // MARK: - 懒加载
  174 + ///数据源
  175 + lazy var dataArray: NSMutableArray = {
  176 + var dataArray = NSMutableArray()
  177 + return dataArray
  178 + }()
  179 + lazy var tableView : UITableView = {
  180 + let tableView = UITableView(frame: .zero, style: .plain)
  181 + tableView.dataSource = self
  182 + tableView.delegate = self
  183 + tableView.emptyDataSetSource = self
  184 + tableView.emptyDataSetDelegate = self
  185 + tableView.separatorStyle = .none
  186 + tableView.tableFooterView = UIView.init()
  187 + tableView.register(CNLiveAlbumCell.self, forCellReuseIdentifier: kCNLiveAlbumCellIdentifier)
  188 + tableView.register(CNLiveAlbumImageCell.self, forCellReuseIdentifier: kCNLiveAlbumImageCellIdentifier)
  189 + return tableView
  190 + }()
  191 +
134 192
135 func numberOfSections(in tableView: UITableView) -> Int { 193 func numberOfSections(in tableView: UITableView) -> Int {
136 2 194 2
@@ -220,67 +278,6 @@ class CNHomepageDetailViewController: CNLiveBaseViewController ,UITableViewData @@ -220,67 +278,6 @@ class CNHomepageDetailViewController: CNLiveBaseViewController ,UITableViewData
220 self!.getBlockContents(page: self!.pageNum) 278 self!.getBlockContents(page: self!.pageNum)
221 }) 279 })
222 } 280 }
223 -  
224 - @objc private func handleDismissPan(gesture: UIPanGestureRecognizer) {  
225 - if !draggingDownToDismiss {  
226 - return  
227 - }  
228 -  
229 - let startingPoint: CGPoint  
230 -  
231 - if let p = interactiveStartingPoint {  
232 - startingPoint = p  
233 - } else {  
234 - startingPoint = gesture.location(in: nil)  
235 - interactiveStartingPoint = startingPoint  
236 - }  
237 -  
238 - let currentLocation = gesture.location(in: nil)  
239 -  
240 - var progress = (currentLocation.y - startingPoint.y) / 100  
241 -  
242 - //prevent viewController bigger when scrolling up  
243 - if currentLocation.y <= startingPoint.y {  
244 - progress = 0  
245 - }  
246 -  
247 - if progress >= 1.0 {  
248 - dismiss(animated: true, completion: nil)  
249 - let nav = self.navigationController as! CNHomePageBaseNavigationController  
250 - nav.dismissClosure?()  
251 -// dismissClosure?()  
252 - stopDismissPanGesture(gesture)  
253 - return  
254 - }  
255 -  
256 - let targetShrinkScale: CGFloat = 0.86  
257 - let currentScale: CGFloat = 1 - (1 - targetShrinkScale) * progress  
258 -  
259 - switch gesture.state {  
260 - case .began,.changed:  
261 - scrollView.isScrollEnabled = false  
262 - gesture.view?.transform = CGAffineTransform(scaleX: currentScale, y: currentScale)  
263 - gesture.view?.layer.cornerRadius = GlobalConstants.toDayCardCornerRadius * (progress)  
264 - scrollView.showsVerticalScrollIndicator = false  
265 - case .cancelled,.ended:  
266 - scrollView.isScrollEnabled = true  
267 - stopDismissPanGesture(gesture)  
268 - default:  
269 - break  
270 - }  
271 - }  
272 -  
273 - //当下拉Offset超过100或取消下拉手势时,执行此方法  
274 - private func stopDismissPanGesture(_ gesture: UIPanGestureRecognizer) {  
275 - draggingDownToDismiss = false  
276 - interactiveStartingPoint = nil  
277 - scrollView.showsVerticalScrollIndicator = true  
278 -  
279 - UIView.animate(withDuration: 0.2) {  
280 - gesture.view?.transform = CGAffineTransform.identity  
281 - }  
282 - }  
283 -  
284 } 281 }
285 282
286 extension CNHomepageDetailViewController: UIViewControllerTransitioningDelegate { 283 extension CNHomepageDetailViewController: UIViewControllerTransitioningDelegate {
metaCode/Classes/Main/HomePages/Controller/AuthController/push相关/CNHomepageDuanJuDetailViewController.swift
@@ -130,7 +130,7 @@ class CNHomepageDuanJuDetailViewController: CNLiveBaseViewController ,UITableVi @@ -130,7 +130,7 @@ class CNHomepageDuanJuDetailViewController: CNLiveBaseViewController ,UITableVi
130 let cell = CNLiveAlbumCell() 130 let cell = CNLiveAlbumCell()
131 return cell 131 return cell
132 } 132 }
133 - cell.albumMsgModel = albumModel 133 + cell.setupNewUIMsgModel(model: albumModel,isDetail: true)
134 return cell 134 return cell
135 } 135 }
136 } 136 }
metaCode/Classes/Main/HomePages/View/HomePage/CNLiveHomePageDuanJuCell.swift
@@ -105,8 +105,7 @@ class CNLiveHomePageDuanJuCell:UITableViewCell,UITableViewDelegate,UITableViewDa @@ -105,8 +105,7 @@ class CNLiveHomePageDuanJuCell:UITableViewCell,UITableViewDelegate,UITableViewDa
105 let cell = CNLiveAlbumCell() 105 let cell = CNLiveAlbumCell()
106 return cell 106 return cell
107 } 107 }
108 - cell.albumMsgModel = model  
109 - 108 + cell.setupNewUIMsgModel(model: model,isDetail: false)
110 return cell 109 return cell
111 } 110 }
112 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 111 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
metaCode/Classes/Main/HomePages/View/HomepageDetail/CNLiveAlbumCell.swift
@@ -18,8 +18,6 @@ class CNLiveAlbumCell:UITableViewCell{ @@ -18,8 +18,6 @@ class CNLiveAlbumCell:UITableViewCell{
18 } 18 }
19 set{ 19 set{
20 _albumMsgModel = newValue! 20 _albumMsgModel = newValue!
21 -  
22 - self.setupNewUIMsgModel(model: _albumMsgModel!)  
23 } 21 }
24 } 22 }
25 23
@@ -31,8 +29,6 @@ class CNLiveAlbumCell:UITableViewCell{ @@ -31,8 +29,6 @@ class CNLiveAlbumCell:UITableViewCell{
31 } 29 }
32 set{ 30 set{
33 _albumModel = newValue! 31 _albumModel = newValue!
34 -  
35 - self.setupNewUI(model: _albumModel!)  
36 } 32 }
37 } 33 }
38 //MARK: - 懒加载 34 //MARK: - 懒加载
@@ -86,18 +82,25 @@ class CNLiveAlbumCell:UITableViewCell{ @@ -86,18 +82,25 @@ class CNLiveAlbumCell:UITableViewCell{
86 fatalError("init(coder:) has not been implemented") 82 fatalError("init(coder:) has not been implemented")
87 } 83 }
88 func setupNewUI(model:CNLiveAlbumModel){ 84 func setupNewUI(model:CNLiveAlbumModel){
  85 + self.albumModel = model
89 self.titleLabl.text = model.title 86 self.titleLabl.text = model.title
90 self.subTitleLabel.text = model.subTitle 87 self.subTitleLabel.text = model.subTitle
91 self.iconImgView.kf.setImage(with: URL(string: model.poster)) 88 self.iconImgView.kf.setImage(with: URL(string: model.poster))
92 self.titleLabl.width = KSreenWidth-(self.iconImgView.right+15)-80 89 self.titleLabl.width = KSreenWidth-(self.iconImgView.right+15)-80
93 self.playBtn.left = KSreenWidth-80 90 self.playBtn.left = KSreenWidth-80
94 } 91 }
95 - func setupNewUIMsgModel(model:CNLiveAlbumMsgModel){ 92 + func setupNewUIMsgModel(model:CNLiveAlbumMsgModel,isDetail:Bool){
  93 + self.albumMsgModel = model
  94 + //在追短剧model
96 self.titleLabl.text = model.albumName 95 self.titleLabl.text = model.albumName
97 self.subTitleLabel.text = model.subTitle 96 self.subTitleLabel.text = model.subTitle
98 self.iconImgView.kf.setImage(with: URL(string: model.albumImg)) 97 self.iconImgView.kf.setImage(with: URL(string: model.albumImg))
99 self.titleLabl.width = KSreenWidth-(self.iconImgView.right+15)-80-30 98 self.titleLabl.width = KSreenWidth-(self.iconImgView.right+15)-80-30
100 - self.playBtn.left = KSreenWidth-80-30 99 + if isDetail{
  100 + self.playBtn.left = KSreenWidth-80
  101 + }else{
  102 + self.playBtn.left = KSreenWidth-80-30
  103 + }
101 } 104 }
102 @objc func playBtnAction(){ 105 @objc func playBtnAction(){
103 showLoading(message: "") 106 showLoading(message: "")
metaCode/Classes/Main/Util/CNUpSlideAnimationTransition.swift
@@ -17,8 +17,9 @@ enum AnimationType { @@ -17,8 +17,9 @@ enum AnimationType {
17 17
18 class CNUpSlideAnimationTransition: NSObject { 18 class CNUpSlideAnimationTransition: NSObject {
19 let animationType: AnimationType! 19 let animationType: AnimationType!
20 -  
21 - init(animationType: AnimationType) { 20 + var cellType:CNLiveHomePageCellType = .course
  21 + init(animationType: AnimationType,cellType:CNLiveHomePageCellType) {
  22 + self.cellType = cellType
22 self.animationType = animationType 23 self.animationType = animationType
23 super.init() 24 super.init()
24 } 25 }
@@ -39,48 +40,185 @@ extension CNUpSlideAnimationTransition: UIViewControllerAnimatedTransitioning { @@ -39,48 +40,185 @@ extension CNUpSlideAnimationTransition: UIViewControllerAnimatedTransitioning {
39 40
40 func animationForPresent(using transitionContext: UIViewControllerContextTransitioning) { 41 func animationForPresent(using transitionContext: UIViewControllerContextTransitioning) {
41 let containerView = transitionContext.containerView 42 let containerView = transitionContext.containerView
42 - //1.Get fromVC and toVC  
43 - guard let fromVC = transitionContext.viewController(forKey: .from) as? CNUpSlideViewController else { return }  
44 - guard let toNaviVC = transitionContext.viewController(forKey: .to) as? CNSlideBaseNavigationController else { return }  
45 - guard let selectedCell = fromVC.selectedCell else { return }  
46 - let toVC = toNaviVC.topViewController as! CNUpSlideDetailViewController  
47 - let frame = selectedCell.convert(selectedCell.bgBackView.frame, to: fromVC.view)  
48 - //2.Set presentation original size.  
49 - toVC.view.frame = frame  
50 - toVC.scrollView.imageView.frame.size.width = GlobalConstants.todayCardSize.width  
51 - toVC.scrollView.imageView.frame.size.height = GlobalConstants.todayCardSize.height  
52 -  
53 - containerView.addSubview(toNaviVC.view)  
54 43
55 - //3.Change original size to final size with animation.  
56 - UIView.animate(withDuration: transitonDuration, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0, options: [], animations: {  
57 - toVC.view.frame = UIScreen.main.bounds  
58 - toVC.scrollView.imageView.frame.size.width = KSreenWidth  
59 - toVC.scrollView.imageView.frame.size.height = KSreenWidth*DownSlideSingleCourseImgH/DownSlideSingleCourseW  
60 - toVC.closeBtn.alpha = 1 44 + if self.cellType == .playlet{
  45 + //1.Get fromVC and toVC
  46 + guard let fromVCtemp = transitionContext.viewController(forKey: .from) as? CNLiveBaseTabBarViewController else { return }
  47 + let fromNavi = fromVCtemp.viewControllers![0] as! CNLiveBaseNavigationController
  48 + let fromVC = fromNavi.viewControllers.first as! CNLiveAuthViewController
  49 + guard let toNaviVC = transitionContext.viewController(forKey: .to) as? CNSlideBaseNavigationController else { return }
  50 + if toNaviVC.topViewController is CNUpSlideDetailViewController{
  51 + guard let selectedCell = fromVC.selectedCell else { return }
  52 + let toVC = toNaviVC.topViewController as! CNUpSlideDetailViewController
  53 + let frame = selectedCell.convert(selectedCell.bgBackView.frame, to: fromVC.view)
  54 + //2.Set presentation original size.
  55 + toVC.view.frame = frame
  56 + toVC.scrollView.imageView.frame.size.width = GlobalConstants.todayCardSize.width
  57 + toVC.scrollView.imageView.frame.size.height = GlobalConstants.todayCardSize.height
  58 +
  59 + containerView.addSubview(toNaviVC.view)
  60 +
  61 + //3.Change original size to final size with animation.
  62 + UIView.animate(withDuration: transitonDuration, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0, options: [], animations: {
  63 + toVC.view.frame = UIScreen.main.bounds
  64 + toVC.scrollView.imageView.frame.size.width = KSreenWidth
  65 + toVC.scrollView.imageView.frame.size.height = KSreenWidth*DownSlideSingleCourseImgH/DownSlideSingleCourseW
  66 + toVC.closeBtn.alpha = 1
  67 +
  68 + }) { (completed) in
  69 + transitionContext.completeTransition(completed)
  70 + }
  71 + }else if toNaviVC.topViewController is CNHomepageDuanJuDetailViewController{
  72 + guard let selectedCell = fromVC.selectedDuanjuCell else { return }
  73 + let toVC = toNaviVC.topViewController as! CNHomepageDuanJuDetailViewController
  74 + let frame = selectedCell.convert(selectedCell.totalView.frame, to: fromVC.view)
  75 + //2.Set presentation original size.
  76 + toVC.view.frame = frame
  77 + containerView.addSubview(toNaviVC.view)
  78 +
  79 + //3.Change original size to final size with animation.
  80 + UIView.animate(withDuration: transitonDuration, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0, options: [], animations: {
  81 + toVC.view.frame = UIScreen.main.bounds
  82 + toVC.closeBtn.alpha = 1
  83 +
  84 + }) { (completed) in
  85 + transitionContext.completeTransition(completed)
  86 + }
  87 + }else{
  88 + return
  89 + }
  90 + }else if self.cellType == .course{
  91 + //1.Get fromVC and toVC
  92 + guard let fromVC = transitionContext.viewController(forKey: .from) as? CNUpSlideViewController else { return }
  93 + guard let toNaviVC = transitionContext.viewController(forKey: .to) as? CNSlideBaseNavigationController else { return }
  94 + guard let selectedCell = fromVC.selectedCell else { return }
  95 + let toVC = toNaviVC.topViewController as! CNUpSlideDetailViewController
  96 + let frame = selectedCell.convert(selectedCell.bgBackView.frame, to: fromVC.view)
  97 + //2.Set presentation original size.
  98 + toVC.view.frame = frame
  99 + toVC.scrollView.imageView.frame.size.width = GlobalConstants.todayCardSize.width
  100 + toVC.scrollView.imageView.frame.size.height = GlobalConstants.todayCardSize.height
  101 +
  102 + containerView.addSubview(toNaviVC.view)
61 103
62 - }) { (completed) in  
63 - transitionContext.completeTransition(completed) 104 + //3.Change original size to final size with animation.
  105 + UIView.animate(withDuration: transitonDuration, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0, options: [], animations: {
  106 + toVC.view.frame = UIScreen.main.bounds
  107 + toVC.scrollView.imageView.frame.size.width = KSreenWidth
  108 + toVC.scrollView.imageView.frame.size.height = KSreenWidth*DownSlideSingleCourseImgH/DownSlideSingleCourseW
  109 + toVC.closeBtn.alpha = 1
  110 +
  111 + }) { (completed) in
  112 + transitionContext.completeTransition(completed)
  113 + }
  114 + }else if self.cellType == .playletToCourse{
  115 + //1.Get fromVC and toVC
  116 + guard let fromVCtemp = transitionContext.viewController(forKey: .from) as? CNLiveBaseTabBarViewController else { return }
  117 + let fromNavi = fromVCtemp.viewControllers![0] as! CNLiveBaseNavigationController
  118 + let fromVC = fromNavi.viewControllers.first as! CNLiveAuthViewController
  119 +// guard let fromVC = transitionContext.viewController(forKey: .from) as? CNUpSlideViewController else { return }
  120 + guard let toNaviVC = transitionContext.viewController(forKey: .to) as? CNSlideBaseNavigationController else { return }
  121 + guard let selectedCell = fromVC.selectedCell else { return }
  122 + let toVC = toNaviVC.topViewController as! CNUpSlideDetailViewController
  123 + let frame = selectedCell.convert(selectedCell.bgBackView.frame, to: fromVC.view)
  124 + //2.Set presentation original size.
  125 + toVC.view.frame = frame
  126 + toVC.scrollView.imageView.frame.size.width = GlobalConstants.todayCardSize.width
  127 + toVC.scrollView.imageView.frame.size.height = GlobalConstants.todayCardSize.height
  128 +
  129 + containerView.addSubview(toNaviVC.view)
  130 +
  131 + //3.Change original size to final size with animation.
  132 + UIView.animate(withDuration: transitonDuration, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0, options: [], animations: {
  133 + toVC.view.frame = UIScreen.main.bounds
  134 + toVC.scrollView.imageView.frame.size.width = KSreenWidth
  135 + toVC.scrollView.imageView.frame.size.height = KSreenWidth*DownSlideSingleCourseImgH/DownSlideSingleCourseW
  136 + toVC.closeBtn.alpha = 1
  137 +
  138 + }) { (completed) in
  139 + transitionContext.completeTransition(completed)
  140 + }
64 } 141 }
65 } 142 }
66 143
67 func animationForDismiss(using transitionContext: UIViewControllerContextTransitioning) { 144 func animationForDismiss(using transitionContext: UIViewControllerContextTransitioning) {
68 - guard let fromNaviVC = transitionContext.viewController(forKey: .from) as? CNSlideBaseNavigationController else { return }  
69 - guard let toVC = transitionContext.viewController(forKey: .to) as? CNUpSlideViewController else { return }  
70 - guard let selectedCell = toVC.selectedCell else { return }  
71 - let fromVC = fromNaviVC.topViewController as! CNUpSlideDetailViewController  
72 -  
73 - UIView.animate(withDuration: transitonDuration - 0.3, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: [], animations: {  
74 - let frame = selectedCell.convert(selectedCell.bgBackView.frame, to: toVC.view)  
75 - fromVC.view.frame = frame  
76 - fromVC.view.layer.cornerRadius = GlobalConstants.toDayCardCornerRadius  
77 - fromVC.scrollView.imageView.frame.size.width = GlobalConstants.todayCardSize.width  
78 - fromVC.scrollView.imageView.frame.size.height = GlobalConstants.todayCardSize.height  
79 - fromVC.closeBtn.alpha = 0 145 + if self.cellType == .playlet{
  146 + guard let fromNaviVC = transitionContext.viewController(forKey: .from) as? CNSlideBaseNavigationController else { return }
  147 + guard let toVCTabbar = transitionContext.viewController(forKey: .to) as? CNLiveBaseTabBarViewController else { return }
  148 + let toVCNav = toVCTabbar.viewControllers?.first as! CNLiveBaseNavigationController
  149 + let toVC = toVCNav.viewControllers.first as! CNLiveAuthViewController
  150 + if fromNaviVC.topViewController is CNUpSlideDetailViewController{
  151 + guard let selectedCell = toVC.selectedCell else { return }
  152 + let fromVC = fromNaviVC.topViewController as! CNUpSlideDetailViewController
  153 +
  154 + UIView.animate(withDuration: transitonDuration - 0.3, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: [], animations: {
  155 + let frame = selectedCell.convert(selectedCell.bgBackView.frame, to: toVC.view)
  156 + fromVC.view.frame = frame
  157 + fromVC.view.layer.cornerRadius = GlobalConstants.toDayCardCornerRadius
  158 + fromVC.scrollView.imageView.frame.size.width = GlobalConstants.todayCardSize.width
  159 + fromVC.scrollView.imageView.frame.size.height = GlobalConstants.todayCardSize.height
  160 + fromVC.closeBtn.alpha = 0
  161 +
  162 + }) { (completed) in
  163 + transitionContext.completeTransition(completed)
  164 + }
  165 + }else if fromNaviVC.topViewController is CNHomepageDuanJuDetailViewController{
  166 + guard let selectedCell = toVC.selectedDuanjuCell else { return }
  167 + let fromVC = fromNaviVC.topViewController as! CNHomepageDuanJuDetailViewController
  168 + UIView.animate(withDuration: transitonDuration - 0.3, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: [], animations: {
  169 + let frame = selectedCell.convert(selectedCell.totalView.frame, to: toVC.view)
  170 + fromVC.view.frame = frame
  171 + fromVC.view.layer.cornerRadius = GlobalConstants.toDayCardCornerRadius
  172 + fromVC.closeBtn.alpha = 0
  173 +
  174 + }) { (completed) in
  175 + transitionContext.completeTransition(completed)
  176 + }
  177 +
  178 + }else{
  179 + return
  180 + }
  181 +
  182 + }else if self.cellType == .course{
  183 + guard let fromNaviVC = transitionContext.viewController(forKey: .from) as? CNSlideBaseNavigationController else { return }
  184 + guard let toVC = transitionContext.viewController(forKey: .to) as? CNUpSlideViewController else { return }
  185 + guard let selectedCell = toVC.selectedCell else { return }
  186 + let fromVC = fromNaviVC.topViewController as! CNUpSlideDetailViewController
  187 +
  188 + UIView.animate(withDuration: transitonDuration - 0.3, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: [], animations: {
  189 + let frame = selectedCell.convert(selectedCell.bgBackView.frame, to: toVC.view)
  190 + fromVC.view.frame = frame
  191 + fromVC.view.layer.cornerRadius = GlobalConstants.toDayCardCornerRadius
  192 + fromVC.scrollView.imageView.frame.size.width = GlobalConstants.todayCardSize.width
  193 + fromVC.scrollView.imageView.frame.size.height = GlobalConstants.todayCardSize.height
  194 + fromVC.closeBtn.alpha = 0
  195 +
  196 + }) { (completed) in
  197 + transitionContext.completeTransition(completed)
  198 + }
  199 +
  200 + }else if self.cellType == .playletToCourse{
  201 + guard let fromNaviVC = transitionContext.viewController(forKey: .from) as? CNSlideBaseNavigationController else { return }
  202 + guard let toVCTabbar = transitionContext.viewController(forKey: .to) as? CNLiveBaseTabBarViewController else { return }
  203 + let toVCNav = toVCTabbar.viewControllers?.first as! CNLiveBaseNavigationController
  204 + let toVC = toVCNav.viewControllers.first as! CNLiveAuthViewController
  205 + guard let selectedCell = toVC.selectedCell else { return }
  206 + let fromVC = fromNaviVC.topViewController as! CNUpSlideDetailViewController
80 207
81 - }) { (completed) in  
82 - transitionContext.completeTransition(completed) 208 + UIView.animate(withDuration: transitonDuration - 0.3, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: [], animations: {
  209 + let frame = selectedCell.convert(selectedCell.bgBackView.frame, to: toVC.view)
  210 + fromVC.view.frame = frame
  211 + fromVC.view.layer.cornerRadius = GlobalConstants.toDayCardCornerRadius
  212 + fromVC.scrollView.imageView.frame.size.width = GlobalConstants.todayCardSize.width
  213 + fromVC.scrollView.imageView.frame.size.height = GlobalConstants.todayCardSize.height
  214 + fromVC.closeBtn.alpha = 0
  215 +
  216 + }) { (completed) in
  217 + transitionContext.completeTransition(completed)
  218 + }
  219 +
83 } 220 }
  221 +
84 } 222 }
85 223
86 } 224 }