Commit df45eda6ed6f37e382f7f98e1b003ae9b0589e21
1 parent
8d05af0c
Exists in
newLive
no message
Showing
8 changed files
with
1025 additions
and
19 deletions
Show diff stats
YouerLiveVideo/YouerLiveVideo.xcodeproj/project.pbxproj
| @@ -48,6 +48,8 @@ | @@ -48,6 +48,8 @@ | ||
| 48 | 599B2CE21DE52F7E00B4F7FD /* UMSocialShareScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 599B2CD01DE52F7E00B4F7FD /* UMSocialShareScrollView.m */; }; | 48 | 599B2CE21DE52F7E00B4F7FD /* UMSocialShareScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 599B2CD01DE52F7E00B4F7FD /* UMSocialShareScrollView.m */; }; |
| 49 | 599B2CE31DE52F7E00B4F7FD /* UMSocialUIManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 599B2CD21DE52F7E00B4F7FD /* UMSocialUIManager.m */; }; | 49 | 599B2CE31DE52F7E00B4F7FD /* UMSocialUIManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 599B2CD21DE52F7E00B4F7FD /* UMSocialUIManager.m */; }; |
| 50 | 59AE3DF91ECE8A90003E2C62 /* pinyin.c in Sources */ = {isa = PBXBuildFile; fileRef = 59AE3DF71ECE8A90003E2C62 /* pinyin.c */; }; | 50 | 59AE3DF91ECE8A90003E2C62 /* pinyin.c in Sources */ = {isa = PBXBuildFile; fileRef = 59AE3DF71ECE8A90003E2C62 /* pinyin.c */; }; |
| 51 | + 59AE3DFB1ECECD7D003E2C62 /* LiveInforViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59AE3DFA1ECECD7D003E2C62 /* LiveInforViewController.swift */; }; | ||
| 52 | + 59AE3DFD1ECED5B1003E2C62 /* MoivePlayerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59AE3DFC1ECED5B1003E2C62 /* MoivePlayerViewController.swift */; }; | ||
| 51 | 59BA13251E25CF2B00540DE0 /* AliyunPlayerSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59BA13241E25CF2B00540DE0 /* AliyunPlayerSDK.framework */; }; | 53 | 59BA13251E25CF2B00540DE0 /* AliyunPlayerSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59BA13241E25CF2B00540DE0 /* AliyunPlayerSDK.framework */; }; |
| 52 | 59BA13271E25CF4B00540DE0 /* AliyunPlayerSDK.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 59BA13241E25CF2B00540DE0 /* AliyunPlayerSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; | 54 | 59BA13271E25CF4B00540DE0 /* AliyunPlayerSDK.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 59BA13241E25CF2B00540DE0 /* AliyunPlayerSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; |
| 53 | 59BA13311E25D1C000540DE0 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 59BA13301E25D1C000540DE0 /* Reachability.m */; }; | 55 | 59BA13311E25D1C000540DE0 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 59BA13301E25D1C000540DE0 /* Reachability.m */; }; |
| @@ -332,6 +334,8 @@ | @@ -332,6 +334,8 @@ | ||
| 332 | 599B2CD21DE52F7E00B4F7FD /* UMSocialUIManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UMSocialUIManager.m; sourceTree = "<group>"; }; | 334 | 599B2CD21DE52F7E00B4F7FD /* UMSocialUIManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UMSocialUIManager.m; sourceTree = "<group>"; }; |
| 333 | 59AE3DF71ECE8A90003E2C62 /* pinyin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pinyin.c; sourceTree = "<group>"; }; | 335 | 59AE3DF71ECE8A90003E2C62 /* pinyin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pinyin.c; sourceTree = "<group>"; }; |
| 334 | 59AE3DF81ECE8A90003E2C62 /* pinyin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pinyin.h; sourceTree = "<group>"; }; | 336 | 59AE3DF81ECE8A90003E2C62 /* pinyin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pinyin.h; sourceTree = "<group>"; }; |
| 337 | + 59AE3DFA1ECECD7D003E2C62 /* LiveInforViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LiveInforViewController.swift; sourceTree = "<group>"; }; | ||
| 338 | + 59AE3DFC1ECED5B1003E2C62 /* MoivePlayerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoivePlayerViewController.swift; sourceTree = "<group>"; }; | ||
| 335 | 59BA13241E25CF2B00540DE0 /* AliyunPlayerSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AliyunPlayerSDK.framework; path = YouerLiveVideo/lib/AliyunPlayerSDK.framework; sourceTree = "<group>"; }; | 339 | 59BA13241E25CF2B00540DE0 /* AliyunPlayerSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AliyunPlayerSDK.framework; path = YouerLiveVideo/lib/AliyunPlayerSDK.framework; sourceTree = "<group>"; }; |
| 336 | 59BA132F1E25D1C000540DE0 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = "<group>"; }; | 340 | 59BA132F1E25D1C000540DE0 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = "<group>"; }; |
| 337 | 59BA13301E25D1C000540DE0 /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = "<group>"; }; | 341 | 59BA13301E25D1C000540DE0 /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = "<group>"; }; |
| @@ -613,6 +617,8 @@ | @@ -613,6 +617,8 @@ | ||
| 613 | isa = PBXGroup; | 617 | isa = PBXGroup; |
| 614 | children = ( | 618 | children = ( |
| 615 | 5904FC471ECA8B8C00E631FF /* ResourceViewController.swift */, | 619 | 5904FC471ECA8B8C00E631FF /* ResourceViewController.swift */, |
| 620 | + 59AE3DFA1ECECD7D003E2C62 /* LiveInforViewController.swift */, | ||
| 621 | + 59AE3DFC1ECED5B1003E2C62 /* MoivePlayerViewController.swift */, | ||
| 616 | 597185B41ECA990C00D7F478 /* Resource.storyboard */, | 622 | 597185B41ECA990C00D7F478 /* Resource.storyboard */, |
| 617 | ); | 623 | ); |
| 618 | path = Resource; | 624 | path = Resource; |
| @@ -1499,6 +1505,7 @@ | @@ -1499,6 +1505,7 @@ | ||
| 1499 | BF25DFF31DDAA36A003EC0C1 /* Timeline.swift in Sources */, | 1505 | BF25DFF31DDAA36A003EC0C1 /* Timeline.swift in Sources */, |
| 1500 | BF25DFFE1DDAA36A003EC0C1 /* SDWebImageDownloader.m in Sources */, | 1506 | BF25DFFE1DDAA36A003EC0C1 /* SDWebImageDownloader.m in Sources */, |
| 1501 | BF7B75A51E305A6D0011D5C7 /* MJRefreshConst.m in Sources */, | 1507 | BF7B75A51E305A6D0011D5C7 /* MJRefreshConst.m in Sources */, |
| 1508 | + 59AE3DFB1ECECD7D003E2C62 /* LiveInforViewController.swift in Sources */, | ||
| 1502 | BF7B759B1E305A6D0011D5C7 /* MJRefreshAutoGifFooter.m in Sources */, | 1509 | BF7B759B1E305A6D0011D5C7 /* MJRefreshAutoGifFooter.m in Sources */, |
| 1503 | BF7B75A81E305A6D0011D5C7 /* UIScrollView+MJRefresh.m in Sources */, | 1510 | BF7B75A81E305A6D0011D5C7 /* UIScrollView+MJRefresh.m in Sources */, |
| 1504 | BF25E0021DDAA36A003EC0C1 /* UIButton+WebCache.m in Sources */, | 1511 | BF25E0021DDAA36A003EC0C1 /* UIButton+WebCache.m in Sources */, |
| @@ -1512,6 +1519,7 @@ | @@ -1512,6 +1519,7 @@ | ||
| 1512 | BFDFDED21DD55C0D0040F102 /* network.swift in Sources */, | 1519 | BFDFDED21DD55C0D0040F102 /* network.swift in Sources */, |
| 1513 | 599B2CE11DE52F7E00B4F7FD /* UMShareMenuSelectionView.m in Sources */, | 1520 | 599B2CE11DE52F7E00B4F7FD /* UMShareMenuSelectionView.m in Sources */, |
| 1514 | BF25DFFF1DDAA36A003EC0C1 /* SDWebImageDownloaderOperation.m in Sources */, | 1521 | BF25DFFF1DDAA36A003EC0C1 /* SDWebImageDownloaderOperation.m in Sources */, |
| 1522 | + 59AE3DFD1ECED5B1003E2C62 /* MoivePlayerViewController.swift in Sources */, | ||
| 1515 | BF25DFF01DDAA36A003EC0C1 /* SessionDelegate.swift in Sources */, | 1523 | BF25DFF01DDAA36A003EC0C1 /* SessionDelegate.swift in Sources */, |
| 1516 | BF25DFE31DDAA36A003EC0C1 /* Alamofire.swift in Sources */, | 1524 | BF25DFE31DDAA36A003EC0C1 /* Alamofire.swift in Sources */, |
| 1517 | BF25DFEC1DDAA36A003EC0C1 /* Response.swift in Sources */, | 1525 | BF25DFEC1DDAA36A003EC0C1 /* Response.swift in Sources */, |
YouerLiveVideo/YouerLiveVideo/controllers/Resource/LiveInforViewController.swift
0 → 100644
| @@ -0,0 +1,88 @@ | @@ -0,0 +1,88 @@ | ||
| 1 | +// | ||
| 2 | +// LiveInforViewController.swift | ||
| 3 | +// YouerLiveVideo | ||
| 4 | +// | ||
| 5 | +// Created by 左丞 on 2017/5/19. | ||
| 6 | +// Copyright © 2017年 左丞. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +import UIKit | ||
| 10 | + | ||
| 11 | +class LiveInforViewController: UIViewController { | ||
| 12 | + | ||
| 13 | + | ||
| 14 | + @IBOutlet weak var player: UIView! | ||
| 15 | + @IBOutlet weak var livePalyer: UIView! | ||
| 16 | + @IBOutlet weak var updataPersonPhoto: UIImageView! | ||
| 17 | + @IBOutlet weak var updataPersonName: UILabel! | ||
| 18 | + @IBOutlet weak var updataTime: UILabel! | ||
| 19 | + | ||
| 20 | + var tvStation:TVStationSubject! | ||
| 21 | + override func viewDidLoad() { | ||
| 22 | + super.viewDidLoad() | ||
| 23 | + AppDelegate.instance().httpServer.getResourceModel(parameters: ["f_id":"2be92331-ea5a-41c9-9025-c954d7df904c" as AnyObject]) { (str, error) in | ||
| 24 | + httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | ||
| 25 | + self.tvStation = TVStationSubject(json: json.contentData()) | ||
| 26 | + self.setAllInfor() | ||
| 27 | + }, failHandler: { (error) in | ||
| 28 | + | ||
| 29 | + }) | ||
| 30 | + } | ||
| 31 | + // Do any additional setup after loading the view. | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + func setAllInfor(){ | ||
| 35 | + updataTime.text = setDateToString(date: dateFromISO8601(dateString: tvStation.f_CreatorTime)) | ||
| 36 | + updataPersonName.text = "上传者: \(tvStation.f_CreatorName!)" | ||
| 37 | + updataPersonPhoto.layer.cornerRadius = updataPersonPhoto.frame.size.height/2 | ||
| 38 | + updataPersonPhoto.layer.masksToBounds = true | ||
| 39 | + updataPersonPhoto.sd_setImage(with: URL(string: tvStation.f_Img), placeholderImage: #imageLiteral(resourceName: "defphoto.png")) | ||
| 40 | + } | ||
| 41 | + | ||
| 42 | + override func didReceiveMemoryWarning() { | ||
| 43 | + super.didReceiveMemoryWarning() | ||
| 44 | + // Dispose of any resources that can be recreated. | ||
| 45 | + } | ||
| 46 | + | ||
| 47 | + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { | ||
| 48 | + if segue.identifier == "player"{ | ||
| 49 | + let vc = segue.destination as! MoivePlayerViewController | ||
| 50 | + vc.mSourceURL = URL(string: "http://vote-weiyun.oss-cn-hangzhou.aliyuncs.com/Videos/c0b2ddd5-46df-41b1-ac4f-bf5e06ee50c0.mp4") | ||
| 51 | + vc.isFullAndHiddenAllBtn = true | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + } | ||
| 55 | + | ||
| 56 | + /* | ||
| 57 | + // MARK: - Navigation | ||
| 58 | + | ||
| 59 | + // In a storyboard-based application, you will often want to do a little preparation before navigation | ||
| 60 | + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { | ||
| 61 | + // Get the new view controller using segue.destinationViewController. | ||
| 62 | + // Pass the selected object to the new view controller. | ||
| 63 | + } | ||
| 64 | + */ | ||
| 65 | + | ||
| 66 | +} | ||
| 67 | + | ||
| 68 | +extension LiveInforViewController:UITableViewDelegate,UITableViewDataSource{ | ||
| 69 | + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { | ||
| 70 | + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! RemainCell | ||
| 71 | + return cell | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { | ||
| 75 | + return 3 | ||
| 76 | + } | ||
| 77 | +} | ||
| 78 | + | ||
| 79 | +class RemainCell: UITableViewCell { | ||
| 80 | + | ||
| 81 | + | ||
| 82 | + @IBOutlet weak var remainContent: UILabel! | ||
| 83 | + @IBOutlet weak var remainName: UILabel! | ||
| 84 | + @IBOutlet weak var remainPhoto: UIImageView! | ||
| 85 | + | ||
| 86 | +} | ||
| 87 | + | ||
| 88 | + |
YouerLiveVideo/YouerLiveVideo/controllers/Resource/MoivePlayerViewController.swift
0 → 100644
| @@ -0,0 +1,599 @@ | @@ -0,0 +1,599 @@ | ||
| 1 | +// | ||
| 2 | +// MoivePlayerViewController.swift | ||
| 3 | +// XSTVideoPalyer | ||
| 4 | +// | ||
| 5 | +// Created by 左丞 on 16/11/23. | ||
| 6 | +// Copyright © 2016年 左丞. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +import UIKit | ||
| 10 | +import Foundation | ||
| 11 | +import MediaPlayer | ||
| 12 | + | ||
| 13 | +enum GestrueType { | ||
| 14 | + case None | ||
| 15 | + case Volume | ||
| 16 | + case Brightness | ||
| 17 | + case Progress | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | + | ||
| 21 | +class MoivePlayerViewController: UIViewController,AliVcAccessKeyProtocol{ | ||
| 22 | + | ||
| 23 | + @IBOutlet weak var pauseImageBtn: UIButton! | ||
| 24 | + @IBOutlet weak var endTime: UILabel! | ||
| 25 | + @IBOutlet weak var startTime: UILabel! | ||
| 26 | + @IBOutlet weak var slider: UISlider! | ||
| 27 | + @IBOutlet weak var screenHorizontalBtn: UIButton! | ||
| 28 | + var mPlayerView:UIView! | ||
| 29 | + var activityBackgroundView:UIView! | ||
| 30 | + var activityIndicator:UIActivityIndicatorView! | ||
| 31 | + var mPlayer:AliVcMediaPlayer! | ||
| 32 | + var systemBrightness:CGFloat!//屏幕亮度 | ||
| 33 | + var conn:Reachability! | ||
| 34 | + var isReplay:Bool = false | ||
| 35 | + var mPaused:Bool = false | ||
| 36 | + var mSourceURL:URL! | ||
| 37 | + | ||
| 38 | + var isLive:Bool = true | ||
| 39 | + var accessKeyID = "LTAIDOJoPQejwtoF" | ||
| 40 | + var accessKeySecret = "rCRMo1TFvBWIkKASB59DRmRJxm9GyK" | ||
| 41 | + var liveTeacherPicture:String="" | ||
| 42 | + var liveTeacherName:String! | ||
| 43 | + var timer:Timer! | ||
| 44 | + var activePersonNum:NSInteger = 0 | ||
| 45 | + var mTimer:Timer! | ||
| 46 | + var bSeeking:Bool = false | ||
| 47 | + var gestureType:GestrueType = .None | ||
| 48 | + var originalLocation:CGPoint! | ||
| 49 | + var progressValue:CGFloat = 0 | ||
| 50 | + var liveOrVideoUrlString:String = "" | ||
| 51 | + var isAllBtnHidden:Bool = false | ||
| 52 | + var isFullAndHiddenAllBtn:Bool = false | ||
| 53 | + func getAccessKeyIDSecret() -> AliVcAccesskey! { | ||
| 54 | + let accessKey = AliVcAccesskey() | ||
| 55 | + accessKey.accessKeyId = accessKeyID | ||
| 56 | + accessKey.accessKeySecret = accessKeySecret | ||
| 57 | + return accessKey | ||
| 58 | + } | ||
| 59 | + override func viewDidLoad() { | ||
| 60 | + super.viewDidLoad() | ||
| 61 | + mSourceURL = URL(string:liveOrVideoUrlString) | ||
| 62 | + AliVcMediaPlayer.setAccessKeyDelegate(self) | ||
| 63 | + NotificationCenter.default.addObserver(self, selector: #selector(MoivePlayerViewController.becomeActive), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil) | ||
| 64 | + NotificationCenter.default.addObserver(self, selector: #selector(MoivePlayerViewController.resignActive), name: NSNotification.Name.UIApplicationWillResignActive, object: nil) | ||
| 65 | + | ||
| 66 | + playMoive() | ||
| 67 | + NotificationCenter.default.addObserver(self, selector: #selector(MoivePlayerViewController.networkStateChange), name: NSNotification.Name.reachabilityChanged, object: nil) | ||
| 68 | + conn = Reachability.forInternetConnection() | ||
| 69 | + conn.startNotifier() | ||
| 70 | + hiddenAllBtn() | ||
| 71 | + displayAllBtn() | ||
| 72 | + | ||
| 73 | + // Do any additional setup after loading the view. | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | + // 返回状态栏的样式 | ||
| 77 | + override var preferredStatusBarStyle: UIStatusBarStyle{ | ||
| 78 | + return UIStatusBarStyle.lightContent | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | + override func viewWillDisappear(_ animated: Bool) { | ||
| 82 | + super.viewWillDisappear(animated) | ||
| 83 | + if timer != nil{ | ||
| 84 | + timer.invalidate() | ||
| 85 | + timer = nil | ||
| 86 | + } | ||
| 87 | + if mTimer != nil{ | ||
| 88 | + mTimer.invalidate() | ||
| 89 | + mTimer = nil | ||
| 90 | + } | ||
| 91 | + } | ||
| 92 | + | ||
| 93 | + override func viewDidAppear(_ animated: Bool) { | ||
| 94 | + super.viewDidAppear(animated) | ||
| 95 | + displayAllBtn() | ||
| 96 | + systemBrightness = UIScreen.main.brightness | ||
| 97 | + | ||
| 98 | + if mSourceURL == nil{ | ||
| 99 | + self.dismiss(animated: true, completion: nil) | ||
| 100 | + AppDelegate.instance().window?.makeToast("该直播或点播不存在") | ||
| 101 | + return | ||
| 102 | + } | ||
| 103 | + | ||
| 104 | + AppDelegate.instance().blockRotation = true | ||
| 105 | + } | ||
| 106 | + | ||
| 107 | + override func viewDidDisappear(_ animated: Bool) { | ||
| 108 | + super.viewDidDisappear(animated) | ||
| 109 | + UIScreen.main.brightness = systemBrightness | ||
| 110 | + } | ||
| 111 | + | ||
| 112 | + func becomeActive(){ | ||
| 113 | + EnterForeGroundPlayVideo() | ||
| 114 | + | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + func resignActive(){ | ||
| 118 | + EnterBackGroundPauseVideo() | ||
| 119 | + } | ||
| 120 | + | ||
| 121 | + func EnterBackGroundPauseVideo(){ | ||
| 122 | + if mPlayer != nil && !mPaused { | ||
| 123 | + mPlayer.pause() | ||
| 124 | + pauseImageBtn.isHidden = false | ||
| 125 | + } | ||
| 126 | + UIScreen.main.brightness = systemBrightness | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + func EnterForeGroundPlayVideo(){ | ||
| 130 | + if mPlayer != nil && !mPaused { | ||
| 131 | + mPlayer.play() | ||
| 132 | + | ||
| 133 | + } | ||
| 134 | + UIScreen.main.brightness = systemBrightness | ||
| 135 | + } | ||
| 136 | + | ||
| 137 | + func networkStateChange(){ | ||
| 138 | + if mSourceURL != nil && mSourceURL.isFileURL{ | ||
| 139 | + checkNetworkState() | ||
| 140 | + } | ||
| 141 | + } | ||
| 142 | + | ||
| 143 | + func checkNetworkState(){ | ||
| 144 | + let wifi = Reachability.forLocalWiFi() | ||
| 145 | + conn = Reachability.forInternetConnection() | ||
| 146 | + if wifi?.currentReachabilityStatus() != NotReachable{ | ||
| 147 | + NSLog("有wifi") | ||
| 148 | + }else if conn.currentReachabilityStatus() != NotReachable{ | ||
| 149 | + NSLog("使用手机自带网络进行上网") | ||
| 150 | + }else{ | ||
| 151 | + NSLog("没有网络") | ||
| 152 | + } | ||
| 153 | + } | ||
| 154 | + func displayAllBtn(){ | ||
| 155 | + if isFullAndHiddenAllBtn{ | ||
| 156 | + pauseImageBtn.isHidden = false | ||
| 157 | + return | ||
| 158 | + } | ||
| 159 | + isAllBtnHidden = false | ||
| 160 | + for i in 0...2{ | ||
| 161 | + self.view.viewWithTag(200+i)?.isHidden = false | ||
| 162 | + } | ||
| 163 | + if !isLive{ | ||
| 164 | + displaySlider() | ||
| 165 | + } | ||
| 166 | + if timer != nil{ | ||
| 167 | + timer.invalidate() | ||
| 168 | + timer = nil | ||
| 169 | + } | ||
| 170 | + timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(MoivePlayerViewController.hiddenAllBtn), userInfo: nil, repeats: false) | ||
| 171 | + } | ||
| 172 | + | ||
| 173 | + func hiddenAllBtn(){ | ||
| 174 | + isAllBtnHidden = true | ||
| 175 | + for i in 0...6{ | ||
| 176 | + self.view.viewWithTag(200+i)?.isHidden = true | ||
| 177 | + } | ||
| 178 | + } | ||
| 179 | + | ||
| 180 | + func displaySlider(){ | ||
| 181 | + if isFullAndHiddenAllBtn{ | ||
| 182 | + return | ||
| 183 | + } | ||
| 184 | + for i in 3...6{ | ||
| 185 | + self.view.viewWithTag(200+i)?.isHidden = false | ||
| 186 | + } | ||
| 187 | + } | ||
| 188 | + | ||
| 189 | + func setupControls(){ | ||
| 190 | + mPlayerView = UIView(frame: CGRect(x: 0, y: 0, width: getScreenWidth(), height: getScreenHeight())) | ||
| 191 | + mPlayerView.backgroundColor = UIColor.clear | ||
| 192 | + self.view.insertSubview(mPlayerView, at: 0) | ||
| 193 | + //缓冲指示 | ||
| 194 | + activityBackgroundView = UIView() | ||
| 195 | + activityBackgroundView.backgroundColor = UIColor.black.withAlphaComponent(0.5) | ||
| 196 | + activityBackgroundView.alpha = 0 | ||
| 197 | + activityBackgroundView.center = mPlayerView.center | ||
| 198 | + activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge) | ||
| 199 | + activityIndicator.hidesWhenStopped = true | ||
| 200 | + activityIndicator.center = mPlayerView.center | ||
| 201 | + activityIndicator.alpha = 0 | ||
| 202 | + } | ||
| 203 | + | ||
| 204 | + func playMoive(){ | ||
| 205 | + if mSourceURL == nil{ | ||
| 206 | + return | ||
| 207 | + } | ||
| 208 | + setupControls() | ||
| 209 | + mPlayer = AliVcMediaPlayer() | ||
| 210 | + mPlayer.create(mPlayerView) | ||
| 211 | + mPlayer.scalingMode = scalingModeAspectFit | ||
| 212 | + mPlayer.view.isUserInteractionEnabled = true | ||
| 213 | + addPlayerObserver() | ||
| 214 | + if isLive{ | ||
| 215 | + mPlayer.mediaType = 1 | ||
| 216 | + }else{ | ||
| 217 | + mPlayer.mediaType = 0 | ||
| 218 | + mTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(MoivePlayerViewController.onTick(_:)), userInfo: nil, repeats: true) | ||
| 219 | + | ||
| 220 | + } | ||
| 221 | + mPlayer.timeout = 25000 | ||
| 222 | + mPlayer.dropBufferDuration = 8000 | ||
| 223 | + mPlayer.scalingMode = scalingModeAspectFitWithCropping | ||
| 224 | + isReplay = false | ||
| 225 | + bSeeking = false | ||
| 226 | + var err = mPlayer.prepare(toPlay: mSourceURL) | ||
| 227 | + if err != ALIVC_SUCCESS{ | ||
| 228 | + activityBackgroundView.removeFromSuperview() | ||
| 229 | + activityIndicator.removeFromSuperview() | ||
| 230 | + return | ||
| 231 | + } | ||
| 232 | + err = mPlayer.play() | ||
| 233 | + if err != ALIVC_SUCCESS{ | ||
| 234 | + return | ||
| 235 | + } | ||
| 236 | + changeMPlayFrame() | ||
| 237 | + showLoadingIndicators() | ||
| 238 | + mPlayer.pause() | ||
| 239 | + pauseImageBtn.isHidden = false | ||
| 240 | + } | ||
| 241 | + func onTick(_ timer:Timer){ | ||
| 242 | + if self.bSeeking { | ||
| 243 | + return | ||
| 244 | + } | ||
| 245 | + if self.mPlayer != nil{ | ||
| 246 | + self.slider.value = Float(self.mPlayer.currentPosition) | ||
| 247 | + self.startTime.text = self.creatTime(timeInter: self.mPlayer.currentPosition) | ||
| 248 | + self.endTime.text = self.creatTime(timeInter: self.mPlayer.duration) | ||
| 249 | + } | ||
| 250 | + } | ||
| 251 | + func replayMoive(){ | ||
| 252 | + mPlayer.prepare(toPlay: mSourceURL) | ||
| 253 | + isReplay = false | ||
| 254 | + bSeeking = false | ||
| 255 | + mPlayer.play() | ||
| 256 | + | ||
| 257 | + } | ||
| 258 | + | ||
| 259 | + @IBAction func isHorScreenClickAction(_ sender: UIButton) { | ||
| 260 | + screenHorizontalBtn.isSelected = !screenHorizontalBtn.isSelected | ||
| 261 | + if screenHorizontalBtn.isSelected{ | ||
| 262 | + screenHorizontalBtn.setBackgroundImage(#imageLiteral(resourceName: "screen_part"), for: .normal) | ||
| 263 | + displayAllBtn() | ||
| 264 | + UIApplication.shared.statusBarOrientation = .landscapeRight | ||
| 265 | + UIApplication.shared.keyWindow?.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_2)) | ||
| 266 | + UIApplication.shared.keyWindow?.frame = CGRect(x: 0, y: 0, width: getScreenHeight(), height: getScreenWidth()) | ||
| 267 | + }else{ | ||
| 268 | + screenHorizontalBtn.setBackgroundImage(#imageLiteral(resourceName: "screen_full"), for: .normal) | ||
| 269 | + UIApplication.shared.statusBarOrientation = .portrait | ||
| 270 | + UIApplication.shared.keyWindow?.transform = CGAffineTransform(rotationAngle: 0) | ||
| 271 | + UIApplication.shared.keyWindow?.frame = CGRect(x: 0, y: 0, width: getScreenWidth(), height: getScreenHeight()) | ||
| 272 | + } | ||
| 273 | + changeMPlayFrame() | ||
| 274 | + } | ||
| 275 | + | ||
| 276 | + override var shouldAutorotate: Bool{ | ||
| 277 | + return false | ||
| 278 | + } | ||
| 279 | + | ||
| 280 | + @IBAction func backBtnClickAction(_ sender: UIButton) { | ||
| 281 | + if screenHorizontalBtn.isSelected{ | ||
| 282 | + isHorScreenClickAction(screenHorizontalBtn) | ||
| 283 | + displayAllBtn() | ||
| 284 | + }else{ | ||
| 285 | + UIApplication.shared.statusBarOrientation = .portrait | ||
| 286 | + UIApplication.shared.keyWindow?.transform = CGAffineTransform(rotationAngle: 0) | ||
| 287 | + UIApplication.shared.keyWindow?.frame = CGRect(x: 0, y: 0, width: getScreenWidth(), height: getScreenHeight()) | ||
| 288 | + AppDelegate.instance().blockRotation = false | ||
| 289 | + if mPlayer != nil{ | ||
| 290 | + mPlayer.destroy() | ||
| 291 | + } | ||
| 292 | + removePlayerObserver() | ||
| 293 | + mPlayer = nil | ||
| 294 | + mSourceURL = nil | ||
| 295 | + self.dismiss(animated: true, completion: nil) | ||
| 296 | + } | ||
| 297 | + } | ||
| 298 | + | ||
| 299 | + @IBAction func playPauseClickAction(_ sender: UIButton) { | ||
| 300 | + if sender == pauseImageBtn{ | ||
| 301 | + sender.isHidden = true | ||
| 302 | + } | ||
| 303 | + displayAllBtn() | ||
| 304 | + if mPlayer != nil{ | ||
| 305 | + if sender.isSelected{ | ||
| 306 | + sender.setBackgroundImage(#imageLiteral(resourceName: "starLive"), for: .normal) | ||
| 307 | + if isReplay { | ||
| 308 | + if isLive{ | ||
| 309 | + mPlayer.prepare(toPlay: mSourceURL) | ||
| 310 | + }else{ | ||
| 311 | + mPlayer.play() | ||
| 312 | + } | ||
| 313 | + isReplay = false | ||
| 314 | + bSeeking = false | ||
| 315 | + } | ||
| 316 | + mPlayer.muteMode = false | ||
| 317 | + }else{ | ||
| 318 | + isReplay = true | ||
| 319 | + sender.setBackgroundImage(#imageLiteral(resourceName: "pause"), for: .normal) | ||
| 320 | + mPaused = true | ||
| 321 | + mPlayer.pause() | ||
| 322 | + pauseImageBtn.isHidden = false | ||
| 323 | + } | ||
| 324 | + sender.isSelected = !sender.isSelected | ||
| 325 | + } | ||
| 326 | + // self.perform(#selector(MoivePlayerViewController.hideControls(com)), with: nil, afterDelay: fadeDelay) | ||
| 327 | + | ||
| 328 | + } | ||
| 329 | + | ||
| 330 | + @IBAction func sliderPanAction(_ sender: UISlider) { | ||
| 331 | + displayAllBtn() | ||
| 332 | + bSeeking = true | ||
| 333 | + startTime.text = creatTime(timeInter: TimeInterval(sender.value)) | ||
| 334 | + if mPlayer != nil{ | ||
| 335 | + mPlayer.seek(to: TimeInterval(sender.value)) | ||
| 336 | + } | ||
| 337 | + } | ||
| 338 | + | ||
| 339 | + func showLoadingIndicators(){ | ||
| 340 | + self.view.addSubview(activityBackgroundView) | ||
| 341 | + self.view.addSubview(activityIndicator) | ||
| 342 | + activityIndicator.startAnimating() | ||
| 343 | + UIView.animate(withDuration: 0.2, animations: { | ||
| 344 | + self.activityBackgroundView.alpha = 1 | ||
| 345 | + self.activityIndicator.alpha = 1 | ||
| 346 | + }) | ||
| 347 | + } | ||
| 348 | + | ||
| 349 | + func hideLoadingIndicators(){ | ||
| 350 | + UIView.animate(withDuration: 0.2, delay: 0, options: .layoutSubviews, animations: { | ||
| 351 | + self.activityBackgroundView.alpha = 0 | ||
| 352 | + self.activityIndicator.alpha = 0 | ||
| 353 | + | ||
| 354 | + }) { (finish) in | ||
| 355 | + self.activityBackgroundView.removeFromSuperview() | ||
| 356 | + self.activityIndicator.removeFromSuperview() | ||
| 357 | + | ||
| 358 | + } | ||
| 359 | + } | ||
| 360 | + | ||
| 361 | + func changeMPlayFrame(){ | ||
| 362 | + if mPlayer != nil && mPlayer.videoWidth != 0{ | ||
| 363 | + let widthbi = CGFloat(mPlayer.videoWidth)/getScreenWidth() | ||
| 364 | + let heightBi = CGFloat(mPlayer.videoHeight)/getScreenHeight() | ||
| 365 | + if widthbi < heightBi || getScreenWidth()>getScreenHeight(){ | ||
| 366 | + mPlayerView.frame = CGRect(x: 0, y: 0, width: getScreenWidth(), height: getScreenHeight()) | ||
| 367 | + }else{ | ||
| 368 | + mPlayerView.frame = CGRect(x: 0, y: 0, width: getScreenWidth(), height: CGFloat(ceil(CGFloat(mPlayer.videoHeight)/widthbi))) | ||
| 369 | + } | ||
| 370 | + }else{ | ||
| 371 | + mPlayerView.frame = CGRect(x: 0, y: 0, width: getScreenWidth(), height: getScreenWidth()/5*3) | ||
| 372 | + } | ||
| 373 | + mPlayerView.center = self.view.center | ||
| 374 | + mPlayer.view = mPlayerView | ||
| 375 | + activityIndicator.center = mPlayerView.center | ||
| 376 | + activityBackgroundView.center = mPlayerView.center | ||
| 377 | + } | ||
| 378 | + | ||
| 379 | + func OnVideoPrepared(noti:Notification){ | ||
| 380 | + slider.maximumValue = Float(mPlayer.duration) | ||
| 381 | + slider.value = Float(mPlayer.currentPosition) | ||
| 382 | + timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(MoivePlayerViewController.hiddenAllBtn), userInfo: nil, repeats: false) | ||
| 383 | + changeMPlayFrame() | ||
| 384 | + endTime.text = creatTime(timeInter: mPlayer.duration) | ||
| 385 | + hideLoadingIndicators() | ||
| 386 | + } | ||
| 387 | + | ||
| 388 | + func creatTime(timeInter:TimeInterval)->String{ | ||
| 389 | + if timeInter > 0{ | ||
| 390 | + let seconds = Int(timeInter)/1000 | ||
| 391 | + return "\(seconds/60/60):\(seconds/60%60):\(seconds%60)" | ||
| 392 | + } | ||
| 393 | + return "0:00:00" | ||
| 394 | + } | ||
| 395 | + | ||
| 396 | + func OnVideoError(noti:Notification){ | ||
| 397 | + isReplay = true | ||
| 398 | + var error_msg = "未知的错误" | ||
| 399 | + let error_code:AliVcMovieErrorCode = mPlayer.errorCode | ||
| 400 | + switch error_code { | ||
| 401 | + case ALIVC_ERR_FUNCTION_DENIED: | ||
| 402 | + error_msg = "未授权" | ||
| 403 | + case ALIVC_ERR_ILLEGALSTATUS: | ||
| 404 | + error_msg = "非法的播放流程" | ||
| 405 | + case ALIVC_ERR_INVALID_INPUTFILE: | ||
| 406 | + error_msg = " 主播还未开播..." | ||
| 407 | + hideLoadingIndicators() | ||
| 408 | + case ALIVC_ERR_NO_INPUTFILE: | ||
| 409 | + error_msg = "无输入文件" | ||
| 410 | + hideLoadingIndicators() | ||
| 411 | + case ALIVC_ERR_NO_NETWORK: | ||
| 412 | + error_msg = "网络连接失败" | ||
| 413 | + case ALIVC_ERR_NO_SUPPORT_CODEC: | ||
| 414 | + error_msg = "不支持的视频编码格式" | ||
| 415 | + hideLoadingIndicators() | ||
| 416 | + case ALIVC_ERR_NO_VIEW: | ||
| 417 | + error_msg = "无显示窗口" | ||
| 418 | + hideLoadingIndicators() | ||
| 419 | + case ALIVC_ERR_NO_MEMORY: | ||
| 420 | + error_msg = "内存不足" | ||
| 421 | + case ALIVC_ERR_DOWNLOAD_TIMEOUT: | ||
| 422 | + error_msg = "网络超时" | ||
| 423 | + case ALIVC_ERR_UNKOWN: | ||
| 424 | + error_msg = "未知错误" | ||
| 425 | + default: | ||
| 426 | + break; | ||
| 427 | + } | ||
| 428 | + if error_code > 500||error_code == ALIVC_ERR_FUNCTION_DENIED{ | ||
| 429 | + mPlayer.reset() | ||
| 430 | + let alertView = UIAlertController(title: nil, message: error_msg, preferredStyle: .alert) | ||
| 431 | + alertView.addAction(UIAlertAction(title: "取消", style: .cancel, handler: nil)) | ||
| 432 | + self.present(alertView, animated: true, completion: nil) | ||
| 433 | + } | ||
| 434 | + if error_code == ALIVC_ERR_DOWNLOAD_TIMEOUT{ | ||
| 435 | + mPlayer.pause() | ||
| 436 | + pauseImageBtn.isHidden = false | ||
| 437 | + | ||
| 438 | + let alertView = UIAlertController(title: nil, message: error_msg, preferredStyle: .alert) | ||
| 439 | + alertView.addAction(UIAlertAction(title: "等待", style: .cancel, handler: nil)) | ||
| 440 | + alertView.addAction(UIAlertAction(title: "重新连接", style: .default, handler: { (action) in | ||
| 441 | + self.mPlayer.stop() | ||
| 442 | + self.showLoadingIndicators() | ||
| 443 | + self.isReplay = true | ||
| 444 | +// replay() | ||
| 445 | + })) | ||
| 446 | + self.present(alertView, animated: true, completion: nil) | ||
| 447 | + | ||
| 448 | + } | ||
| 449 | + | ||
| 450 | + } | ||
| 451 | + | ||
| 452 | + func OnVideoFinish(noti:Notification){ | ||
| 453 | + isReplay = true | ||
| 454 | + playPauseClickAction(self.view.viewWithTag(202) as! UIButton) | ||
| 455 | + mPlayer.stop() | ||
| 456 | + } | ||
| 457 | + | ||
| 458 | + func OnSeekDone(noti:Notification){ | ||
| 459 | + bSeeking = false | ||
| 460 | + } | ||
| 461 | + | ||
| 462 | + func OnStartCache(noti:Notification){ | ||
| 463 | + showLoadingIndicators() | ||
| 464 | + } | ||
| 465 | + | ||
| 466 | + func OnEndCache(noti:Notification){ | ||
| 467 | + hideLoadingIndicators() | ||
| 468 | + } | ||
| 469 | + | ||
| 470 | + | ||
| 471 | + func addPlayerObserver(){ | ||
| 472 | + NotificationCenter.default.addObserver(self, selector: #selector(MoivePlayerViewController.OnVideoPrepared(noti:)), name: NSNotification.Name.AliVcMediaPlayerLoadDidPrepared, object: mPlayer) | ||
| 473 | + NotificationCenter.default.addObserver(self, selector: #selector(MoivePlayerViewController.OnVideoError(noti:)), name: NSNotification.Name.AliVcMediaPlayerPlaybackError, object: mPlayer) | ||
| 474 | + NotificationCenter.default.addObserver(self, selector: #selector(MoivePlayerViewController.OnVideoFinish(noti:)), name: NSNotification.Name.AliVcMediaPlayerPlaybackDidFinish, object: mPlayer) | ||
| 475 | + NotificationCenter.default.addObserver(self, selector: #selector(MoivePlayerViewController.OnSeekDone(noti:)), name: NSNotification.Name.AliVcMediaPlayerSeekingDidFinish, object: mPlayer) | ||
| 476 | + NotificationCenter.default.addObserver(self, selector: #selector(MoivePlayerViewController.OnStartCache(noti:)), name: NSNotification.Name.AliVcMediaPlayerStartCaching, object: mPlayer) | ||
| 477 | + NotificationCenter.default.addObserver(self, selector: #selector(MoivePlayerViewController.OnEndCache(noti:)), name: NSNotification.Name.AliVcMediaPlayerEndCaching, object: mPlayer) | ||
| 478 | + | ||
| 479 | + } | ||
| 480 | + | ||
| 481 | + func removePlayerObserver(){ | ||
| 482 | + NotificationCenter.default.removeObserver(self, name: NSNotification.Name.AliVcMediaPlayerLoadDidPrepared, object: mPlayer) | ||
| 483 | + NotificationCenter.default.removeObserver(self, name: NSNotification.Name.AliVcMediaPlayerPlaybackError, object: mPlayer) | ||
| 484 | + NotificationCenter.default.removeObserver(self, name: NSNotification.Name.AliVcMediaPlayerPlaybackDidFinish, object: mPlayer) | ||
| 485 | + NotificationCenter.default.removeObserver(self, name: NSNotification.Name.AliVcMediaPlayerSeekingDidFinish, object: mPlayer) | ||
| 486 | + NotificationCenter.default.removeObserver(self, name: NSNotification.Name.AliVcMediaPlayerStartCaching, object: mPlayer) | ||
| 487 | + NotificationCenter.default.removeObserver(self, name: NSNotification.Name.AliVcMediaPlayerEndCaching, object: mPlayer) | ||
| 488 | + } | ||
| 489 | + | ||
| 490 | + override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { | ||
| 491 | + bSeeking = true | ||
| 492 | + originalLocation = CGPoint(x: 0, y: 0) | ||
| 493 | + progressValue = 0 | ||
| 494 | + } | ||
| 495 | + | ||
| 496 | + override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { | ||
| 497 | + displayAllBtn() | ||
| 498 | + let touch = touches.first | ||
| 499 | + let currenLocation = touch!.location(in: self.view) | ||
| 500 | + let offset_x = currenLocation.x - originalLocation.x | ||
| 501 | + let offset_y = currenLocation.y - originalLocation.y | ||
| 502 | + if __CGPointEqualToPoint(originalLocation, CGPointZero){ | ||
| 503 | + originalLocation = currenLocation | ||
| 504 | + return | ||
| 505 | + } | ||
| 506 | + originalLocation = currenLocation | ||
| 507 | + if abs(offset_x) <= abs(offset_y){ | ||
| 508 | + gestureType = .Volume | ||
| 509 | + }else if abs(offset_x) > abs(offset_y) { | ||
| 510 | + gestureType = .Progress | ||
| 511 | + } | ||
| 512 | + if gestureType == .Progress{ | ||
| 513 | + if mPlayer != nil{ | ||
| 514 | + if offset_x > 0{ | ||
| 515 | + if slider.value+ProgressStep*1000 <= Float(mPlayer.duration){ | ||
| 516 | + slider.value = slider.value+ProgressStep*1000 | ||
| 517 | + startTime.text = creatTime(timeInter: TimeInterval(slider.value)) | ||
| 518 | + }else{ | ||
| 519 | + slider.value = Float(mPlayer.duration) | ||
| 520 | + startTime.text = creatTime(timeInter: mPlayer.duration) | ||
| 521 | + } | ||
| 522 | + }else{ | ||
| 523 | + if slider.value-ProgressStep*1000 >= 0{ | ||
| 524 | + slider.value = slider.value-ProgressStep*1000 | ||
| 525 | + startTime.text = creatTime(timeInter: TimeInterval(slider.value)) | ||
| 526 | + }else{ | ||
| 527 | + slider.value = 0 | ||
| 528 | + startTime.text = "0:0:0" | ||
| 529 | + } | ||
| 530 | + } | ||
| 531 | + } | ||
| 532 | + }else if gestureType == .Volume{ | ||
| 533 | + volumeAdd(step: offset_y > 0 ? -VolumeStep : VolumeStep) | ||
| 534 | + } | ||
| 535 | + | ||
| 536 | + } | ||
| 537 | + | ||
| 538 | + var VolumeStep:CGFloat = 0.02 | ||
| 539 | + var ProgressStep:Float = 5 | ||
| 540 | + override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { | ||
| 541 | + switch gestureType { | ||
| 542 | + case .None: | ||
| 543 | + if !isAllBtnHidden{ | ||
| 544 | + playPauseClickAction(self.view.viewWithTag(202) as! UIButton) | ||
| 545 | + } | ||
| 546 | + break | ||
| 547 | + case .Brightness: | ||
| 548 | + progressValue = 0 | ||
| 549 | + gestureType = .None | ||
| 550 | + | ||
| 551 | + case .Progress: | ||
| 552 | + gestureType = .None | ||
| 553 | + if mPlayer != nil{ | ||
| 554 | + mPlayer.seek(to: TimeInterval(slider.value)) | ||
| 555 | + } | ||
| 556 | + progressValue = 0 | ||
| 557 | + default: | ||
| 558 | + break | ||
| 559 | + } | ||
| 560 | + bSeeking = false | ||
| 561 | + displayAllBtn() | ||
| 562 | + } | ||
| 563 | + | ||
| 564 | + //func willShowComments(_ seek: Bool) -> CGFloat { | ||
| 565 | + // return commentNUM | ||
| 566 | + //} | ||
| 567 | + | ||
| 568 | + | ||
| 569 | + override func didReceiveMemoryWarning() { | ||
| 570 | + super.didReceiveMemoryWarning() | ||
| 571 | + // Dispose of any resources that can be recreated. | ||
| 572 | + } | ||
| 573 | + | ||
| 574 | + func volumeAdd(step:CGFloat){ | ||
| 575 | + let volumeView = MPVolumeView() | ||
| 576 | + var volumeSlider:UISlider! | ||
| 577 | + for view in volumeView.subviews { | ||
| 578 | + if view.classForCoder.description() == "MPVolumeSlider"{ | ||
| 579 | + volumeSlider = view as? UISlider | ||
| 580 | + break | ||
| 581 | + } | ||
| 582 | + } | ||
| 583 | + volumeSlider.value = volumeSlider.value+Float(step) | ||
| 584 | + } | ||
| 585 | + // MARK: - 销毁通知 | ||
| 586 | + deinit { | ||
| 587 | + NotificationCenter.default.removeObserver(self) | ||
| 588 | + } | ||
| 589 | + /* | ||
| 590 | + // MARK: - Navigation | ||
| 591 | + | ||
| 592 | + // In a storyboard-based application, you will often want to do a little preparation before navigation | ||
| 593 | + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { | ||
| 594 | + // Get the new view controller using segue.destinationViewController. | ||
| 595 | + // Pass the selected object to the new view controller. | ||
| 596 | + } | ||
| 597 | + */ | ||
| 598 | + | ||
| 599 | +} |
YouerLiveVideo/YouerLiveVideo/controllers/Resource/Resource.storyboard
| @@ -5,6 +5,304 @@ | @@ -5,6 +5,304 @@ | ||
| 5 | </device> | 5 | </device> |
| 6 | <dependencies> | 6 | <dependencies> |
| 7 | <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11757"/> | 7 | <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11757"/> |
| 8 | + <capability name="Aspect ratio constraints" minToolsVersion="5.1"/> | ||
| 9 | + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | ||
| 8 | </dependencies> | 10 | </dependencies> |
| 9 | - <scenes/> | 11 | + <scenes> |
| 12 | + <!--Live Infor View Controller--> | ||
| 13 | + <scene sceneID="QrF-a4-VNS"> | ||
| 14 | + <objects> | ||
| 15 | + <viewController storyboardIdentifier="LiveInforViewControllerVC" id="s4r-mT-PYC" customClass="LiveInforViewController" customModule="YouerLiveVideo" customModuleProvider="target" sceneMemberID="viewController"> | ||
| 16 | + <layoutGuides> | ||
| 17 | + <viewControllerLayoutGuide type="top" id="snl-VP-dYK"/> | ||
| 18 | + <viewControllerLayoutGuide type="bottom" id="kPK-zX-bXF"/> | ||
| 19 | + </layoutGuides> | ||
| 20 | + <view key="view" contentMode="scaleToFill" id="ryJ-PM-vNa"> | ||
| 21 | + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> | ||
| 22 | + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||
| 23 | + <subviews> | ||
| 24 | + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gC6-xK-DuK"> | ||
| 25 | + <rect key="frame" x="0.0" y="20" width="375" height="197"/> | ||
| 26 | + <subviews> | ||
| 27 | + <containerView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Lhy-r0-VWQ"> | ||
| 28 | + <rect key="frame" x="0.0" y="0.0" width="375" height="197"/> | ||
| 29 | + <connections> | ||
| 30 | + <segue destination="AG5-Hc-gbL" kind="embed" identifier="player" id="7RX-MD-Wib"/> | ||
| 31 | + </connections> | ||
| 32 | + </containerView> | ||
| 33 | + </subviews> | ||
| 34 | + <color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/> | ||
| 35 | + <constraints> | ||
| 36 | + <constraint firstItem="Lhy-r0-VWQ" firstAttribute="leading" secondItem="gC6-xK-DuK" secondAttribute="leading" id="8Xf-WG-xO3"/> | ||
| 37 | + <constraint firstAttribute="bottom" secondItem="Lhy-r0-VWQ" secondAttribute="bottom" id="Ovx-fX-8ZY"/> | ||
| 38 | + <constraint firstAttribute="trailing" secondItem="Lhy-r0-VWQ" secondAttribute="trailing" id="eA6-YF-3Cr"/> | ||
| 39 | + <constraint firstAttribute="width" secondItem="gC6-xK-DuK" secondAttribute="height" multiplier="375:197" id="h7W-7Q-uoS"/> | ||
| 40 | + <constraint firstItem="Lhy-r0-VWQ" firstAttribute="top" secondItem="gC6-xK-DuK" secondAttribute="top" id="x7d-k0-shm"/> | ||
| 41 | + </constraints> | ||
| 42 | + </view> | ||
| 43 | + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0dd-f2-HXU"> | ||
| 44 | + <rect key="frame" x="0.0" y="217" width="375" height="50"/> | ||
| 45 | + <subviews> | ||
| 46 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="上传者:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vhu-tv-jE5"> | ||
| 47 | + <rect key="frame" x="62" y="14.5" width="57" height="21"/> | ||
| 48 | + <fontDescription key="fontDescription" type="system" pointSize="17"/> | ||
| 49 | + <nil key="textColor"/> | ||
| 50 | + <nil key="highlightedColor"/> | ||
| 51 | + </label> | ||
| 52 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="D0M-d2-H4x"> | ||
| 53 | + <rect key="frame" x="317" y="14.5" width="42" height="21"/> | ||
| 54 | + <fontDescription key="fontDescription" type="system" pointSize="17"/> | ||
| 55 | + <nil key="textColor"/> | ||
| 56 | + <nil key="highlightedColor"/> | ||
| 57 | + </label> | ||
| 58 | + <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="defphoto.png" translatesAutoresizingMaskIntoConstraints="NO" id="pV2-jS-olB"> | ||
| 59 | + <rect key="frame" x="16" y="10" width="30" height="30"/> | ||
| 60 | + <constraints> | ||
| 61 | + <constraint firstAttribute="width" secondItem="pV2-jS-olB" secondAttribute="height" multiplier="1:1" id="Fnh-z5-EBT"/> | ||
| 62 | + <constraint firstAttribute="height" constant="30" id="VWP-zt-U9q"/> | ||
| 63 | + </constraints> | ||
| 64 | + </imageView> | ||
| 65 | + </subviews> | ||
| 66 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | ||
| 67 | + <constraints> | ||
| 68 | + <constraint firstAttribute="trailing" secondItem="D0M-d2-H4x" secondAttribute="trailing" constant="16" id="13y-bV-Zop"/> | ||
| 69 | + <constraint firstItem="D0M-d2-H4x" firstAttribute="centerY" secondItem="0dd-f2-HXU" secondAttribute="centerY" id="FEe-yZ-UIw"/> | ||
| 70 | + <constraint firstItem="pV2-jS-olB" firstAttribute="leading" secondItem="0dd-f2-HXU" secondAttribute="leading" constant="16" id="QHU-9G-jbE"/> | ||
| 71 | + <constraint firstItem="vhu-tv-jE5" firstAttribute="leading" secondItem="pV2-jS-olB" secondAttribute="trailing" constant="16" id="ZEN-k0-SXx"/> | ||
| 72 | + <constraint firstItem="pV2-jS-olB" firstAttribute="centerY" secondItem="0dd-f2-HXU" secondAttribute="centerY" id="jJA-NW-4Bo"/> | ||
| 73 | + <constraint firstAttribute="height" constant="50" id="rEQ-CU-zbj"/> | ||
| 74 | + <constraint firstItem="vhu-tv-jE5" firstAttribute="centerY" secondItem="0dd-f2-HXU" secondAttribute="centerY" id="toz-1B-3D4"/> | ||
| 75 | + </constraints> | ||
| 76 | + </view> | ||
| 77 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="评论" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="37F-vt-Ubl"> | ||
| 78 | + <rect key="frame" x="16" y="283" width="35" height="21"/> | ||
| 79 | + <fontDescription key="fontDescription" type="system" pointSize="17"/> | ||
| 80 | + <nil key="textColor"/> | ||
| 81 | + <nil key="highlightedColor"/> | ||
| 82 | + </label> | ||
| 83 | + <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="105" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="YzG-te-5GE"> | ||
| 84 | + <rect key="frame" x="0.0" y="320" width="375" height="347"/> | ||
| 85 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | ||
| 86 | + <prototypes> | ||
| 87 | + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="cell" rowHeight="105" id="6hZ-hT-pb5" customClass="RemainCell" customModule="YouerLiveVideo" customModuleProvider="target"> | ||
| 88 | + <rect key="frame" x="0.0" y="28" width="375" height="105"/> | ||
| 89 | + <autoresizingMask key="autoresizingMask"/> | ||
| 90 | + <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="6hZ-hT-pb5" id="4h2-wz-x2X"> | ||
| 91 | + <rect key="frame" x="0.0" y="0.0" width="375" height="104"/> | ||
| 92 | + <autoresizingMask key="autoresizingMask"/> | ||
| 93 | + <subviews> | ||
| 94 | + <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="defphoto.png" translatesAutoresizingMaskIntoConstraints="NO" id="f7H-p9-HHC"> | ||
| 95 | + <rect key="frame" x="16" y="37" width="30" height="30"/> | ||
| 96 | + <constraints> | ||
| 97 | + <constraint firstAttribute="height" constant="30" id="upk-so-mba"/> | ||
| 98 | + </constraints> | ||
| 99 | + </imageView> | ||
| 100 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2sM-NA-DnB"> | ||
| 101 | + <rect key="frame" x="54" y="37" width="37.5" height="59.5"/> | ||
| 102 | + <fontDescription key="fontDescription" type="system" pointSize="15"/> | ||
| 103 | + <nil key="textColor"/> | ||
| 104 | + <nil key="highlightedColor"/> | ||
| 105 | + </label> | ||
| 106 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qFu-il-ers"> | ||
| 107 | + <rect key="frame" x="54" y="8" width="42" height="21"/> | ||
| 108 | + <fontDescription key="fontDescription" type="system" pointSize="17"/> | ||
| 109 | + <nil key="textColor"/> | ||
| 110 | + <nil key="highlightedColor"/> | ||
| 111 | + </label> | ||
| 112 | + </subviews> | ||
| 113 | + <constraints> | ||
| 114 | + <constraint firstItem="qFu-il-ers" firstAttribute="top" secondItem="4h2-wz-x2X" secondAttribute="top" constant="8" id="9Aa-kY-qJV"/> | ||
| 115 | + <constraint firstItem="f7H-p9-HHC" firstAttribute="centerY" secondItem="4h2-wz-x2X" secondAttribute="centerY" id="LFp-TX-eSb"/> | ||
| 116 | + <constraint firstItem="2sM-NA-DnB" firstAttribute="leading" secondItem="f7H-p9-HHC" secondAttribute="trailing" constant="8" id="Ry6-2n-cpe"/> | ||
| 117 | + <constraint firstItem="2sM-NA-DnB" firstAttribute="top" secondItem="qFu-il-ers" secondAttribute="bottom" constant="8" id="WWG-Zn-SB1"/> | ||
| 118 | + <constraint firstAttribute="bottom" secondItem="2sM-NA-DnB" secondAttribute="bottom" constant="8" id="Y0q-CO-3Xt"/> | ||
| 119 | + <constraint firstItem="qFu-il-ers" firstAttribute="leading" secondItem="f7H-p9-HHC" secondAttribute="trailing" constant="8" id="YsK-Gj-Abx"/> | ||
| 120 | + <constraint firstItem="f7H-p9-HHC" firstAttribute="leading" secondItem="4h2-wz-x2X" secondAttribute="leading" constant="16" id="Yy4-ay-kIH"/> | ||
| 121 | + <constraint firstItem="f7H-p9-HHC" firstAttribute="width" secondItem="f7H-p9-HHC" secondAttribute="height" multiplier="1:1" id="elw-Rd-wMV"/> | ||
| 122 | + </constraints> | ||
| 123 | + </tableViewCellContentView> | ||
| 124 | + <connections> | ||
| 125 | + <outlet property="remainContent" destination="2sM-NA-DnB" id="aZ5-OB-Bok"/> | ||
| 126 | + <outlet property="remainName" destination="qFu-il-ers" id="UAq-gM-WoV"/> | ||
| 127 | + <outlet property="remainPhoto" destination="f7H-p9-HHC" id="Epp-8Y-SYZ"/> | ||
| 128 | + </connections> | ||
| 129 | + </tableViewCell> | ||
| 130 | + </prototypes> | ||
| 131 | + <connections> | ||
| 132 | + <outlet property="dataSource" destination="s4r-mT-PYC" id="ek1-Yw-7PU"/> | ||
| 133 | + <outlet property="delegate" destination="s4r-mT-PYC" id="ZzP-m9-r2C"/> | ||
| 134 | + </connections> | ||
| 135 | + </tableView> | ||
| 136 | + </subviews> | ||
| 137 | + <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/> | ||
| 138 | + <constraints> | ||
| 139 | + <constraint firstItem="YzG-te-5GE" firstAttribute="leading" secondItem="ryJ-PM-vNa" secondAttribute="leading" id="0sL-KS-Byo"/> | ||
| 140 | + <constraint firstItem="gC6-xK-DuK" firstAttribute="top" secondItem="snl-VP-dYK" secondAttribute="bottom" id="1oC-0b-69r"/> | ||
| 141 | + <constraint firstItem="37F-vt-Ubl" firstAttribute="leading" secondItem="ryJ-PM-vNa" secondAttribute="leading" constant="16" id="2g0-tI-TxZ"/> | ||
| 142 | + <constraint firstItem="0dd-f2-HXU" firstAttribute="leading" secondItem="ryJ-PM-vNa" secondAttribute="leading" id="A8d-I4-F4c"/> | ||
| 143 | + <constraint firstItem="37F-vt-Ubl" firstAttribute="top" secondItem="0dd-f2-HXU" secondAttribute="bottom" constant="16" id="Sca-nt-SSo"/> | ||
| 144 | + <constraint firstAttribute="trailing" secondItem="YzG-te-5GE" secondAttribute="trailing" id="Sgg-8M-pCD"/> | ||
| 145 | + <constraint firstAttribute="trailing" secondItem="0dd-f2-HXU" secondAttribute="trailing" id="XPS-2M-AsX"/> | ||
| 146 | + <constraint firstItem="0dd-f2-HXU" firstAttribute="top" secondItem="gC6-xK-DuK" secondAttribute="bottom" id="Yvf-az-aNu"/> | ||
| 147 | + <constraint firstItem="kPK-zX-bXF" firstAttribute="top" secondItem="YzG-te-5GE" secondAttribute="bottom" id="aco-v7-Z2w"/> | ||
| 148 | + <constraint firstItem="gC6-xK-DuK" firstAttribute="leading" secondItem="ryJ-PM-vNa" secondAttribute="leading" id="ccP-uW-9L0"/> | ||
| 149 | + <constraint firstAttribute="trailing" secondItem="gC6-xK-DuK" secondAttribute="trailing" id="paS-4R-cgF"/> | ||
| 150 | + <constraint firstItem="YzG-te-5GE" firstAttribute="top" secondItem="37F-vt-Ubl" secondAttribute="bottom" constant="16" id="qqu-Cb-zkI"/> | ||
| 151 | + </constraints> | ||
| 152 | + </view> | ||
| 153 | + <connections> | ||
| 154 | + <outlet property="livePalyer" destination="gC6-xK-DuK" id="GdW-rI-5cs"/> | ||
| 155 | + <outlet property="player" destination="Lhy-r0-VWQ" id="F7N-Px-QJk"/> | ||
| 156 | + <outlet property="updataPersonName" destination="vhu-tv-jE5" id="DKg-wh-dO1"/> | ||
| 157 | + <outlet property="updataPersonPhoto" destination="pV2-jS-olB" id="fe1-wA-Vls"/> | ||
| 158 | + <outlet property="updataTime" destination="D0M-d2-H4x" id="o5h-0g-DCX"/> | ||
| 159 | + </connections> | ||
| 160 | + </viewController> | ||
| 161 | + <placeholder placeholderIdentifier="IBFirstResponder" id="SKN-jS-qgG" userLabel="First Responder" sceneMemberID="firstResponder"/> | ||
| 162 | + </objects> | ||
| 163 | + <point key="canvasLocation" x="32.799999999999997" y="265.81709145427288"/> | ||
| 164 | + </scene> | ||
| 165 | + <!--Moive Player View Controller--> | ||
| 166 | + <scene sceneID="ROY-Hr-0Qk"> | ||
| 167 | + <objects> | ||
| 168 | + <viewController storyboardIdentifier="MoivePlayerViewControllerVC" id="AG5-Hc-gbL" customClass="MoivePlayerViewController" customModule="YouerLiveVideo" customModuleProvider="target" sceneMemberID="viewController"> | ||
| 169 | + <layoutGuides> | ||
| 170 | + <viewControllerLayoutGuide type="top" id="jyA-tw-Uyk"/> | ||
| 171 | + <viewControllerLayoutGuide type="bottom" id="oH7-yb-GUD"/> | ||
| 172 | + </layoutGuides> | ||
| 173 | + <view key="view" contentMode="scaleToFill" id="Rfl-kc-zCQ"> | ||
| 174 | + <rect key="frame" x="0.0" y="0.0" width="375" height="197"/> | ||
| 175 | + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||
| 176 | + <subviews> | ||
| 177 | + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Thc-Nf-cbR"> | ||
| 178 | + <rect key="frame" x="0.0" y="-20" width="375" height="217"/> | ||
| 179 | + <subviews> | ||
| 180 | + <button hidden="YES" opaque="NO" tag="202" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="MUs-SM-Frh"> | ||
| 181 | + <rect key="frame" x="337" y="96" width="30" height="30"/> | ||
| 182 | + <constraints> | ||
| 183 | + <constraint firstAttribute="width" secondItem="MUs-SM-Frh" secondAttribute="height" multiplier="1:1" id="ItK-UQ-dV5"/> | ||
| 184 | + <constraint firstAttribute="height" constant="30" id="v4s-t0-4WZ"/> | ||
| 185 | + </constraints> | ||
| 186 | + <state key="normal" backgroundImage="starLive"/> | ||
| 187 | + <connections> | ||
| 188 | + <action selector="playPauseClickAction:" destination="AG5-Hc-gbL" eventType="touchUpInside" id="GBR-eV-jm0"/> | ||
| 189 | + </connections> | ||
| 190 | + </button> | ||
| 191 | + <button hidden="YES" opaque="NO" tag="200" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xoR-0a-vkL"> | ||
| 192 | + <rect key="frame" x="337" y="20" width="30" height="30"/> | ||
| 193 | + <constraints> | ||
| 194 | + <constraint firstAttribute="width" secondItem="xoR-0a-vkL" secondAttribute="height" multiplier="1:1" id="2Bn-3Z-hmn"/> | ||
| 195 | + <constraint firstAttribute="width" constant="30" id="4mL-wm-czK"/> | ||
| 196 | + </constraints> | ||
| 197 | + <state key="normal" backgroundImage="closeAlive"/> | ||
| 198 | + <connections> | ||
| 199 | + <action selector="backBtnClickAction:" destination="AG5-Hc-gbL" eventType="touchUpInside" id="kmy-8E-4U8"/> | ||
| 200 | + </connections> | ||
| 201 | + </button> | ||
| 202 | + <button hidden="YES" opaque="NO" tag="201" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="gtT-Mf-dIt"> | ||
| 203 | + <rect key="frame" x="337" y="58" width="30" height="30"/> | ||
| 204 | + <constraints> | ||
| 205 | + <constraint firstAttribute="width" secondItem="gtT-Mf-dIt" secondAttribute="height" multiplier="1:1" id="O7Q-Ee-lkM"/> | ||
| 206 | + <constraint firstAttribute="height" constant="30" id="eyK-dy-ZAb"/> | ||
| 207 | + </constraints> | ||
| 208 | + <state key="normal" backgroundImage="screen_full"/> | ||
| 209 | + <connections> | ||
| 210 | + <action selector="isHorScreenClickAction:" destination="AG5-Hc-gbL" eventType="touchUpInside" id="RHa-U8-lFw"/> | ||
| 211 | + </connections> | ||
| 212 | + </button> | ||
| 213 | + <view tag="206" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jyu-RM-z6z"> | ||
| 214 | + <rect key="frame" x="0.0" y="167" width="375" height="50"/> | ||
| 215 | + <subviews> | ||
| 216 | + <label opaque="NO" userInteractionEnabled="NO" tag="205" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="00:00:00" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="MVE-hx-Orw"> | ||
| 217 | + <rect key="frame" x="314" y="19" width="57" height="16"/> | ||
| 218 | + <fontDescription key="fontDescription" type="system" pointSize="13"/> | ||
| 219 | + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | ||
| 220 | + <nil key="highlightedColor"/> | ||
| 221 | + </label> | ||
| 222 | + <label opaque="NO" userInteractionEnabled="NO" tag="204" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="00:00:00" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="N0I-7c-9U5"> | ||
| 223 | + <rect key="frame" x="4" y="19" width="57" height="16"/> | ||
| 224 | + <fontDescription key="fontDescription" type="system" pointSize="13"/> | ||
| 225 | + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | ||
| 226 | + <nil key="highlightedColor"/> | ||
| 227 | + </label> | ||
| 228 | + <slider opaque="NO" tag="203" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="VR5-78-Tv5"> | ||
| 229 | + <rect key="frame" x="67" y="12" width="241" height="31"/> | ||
| 230 | + <color key="minimumTrackTintColor" red="0.50980392159999999" green="0.81176470590000005" blue="0.44705882349999998" alpha="1" colorSpace="calibratedRGB"/> | ||
| 231 | + <color key="maximumTrackTintColor" red="0.90980392160000001" green="0.90196078430000004" blue="0.90588235289999997" alpha="1" colorSpace="calibratedRGB"/> | ||
| 232 | + <color key="thumbTintColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | ||
| 233 | + <connections> | ||
| 234 | + <action selector="sliderPanAction:" destination="AG5-Hc-gbL" eventType="valueChanged" id="ddq-LB-dDE"/> | ||
| 235 | + </connections> | ||
| 236 | + </slider> | ||
| 237 | + </subviews> | ||
| 238 | + <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.29097630029999999" colorSpace="calibratedRGB"/> | ||
| 239 | + <constraints> | ||
| 240 | + <constraint firstItem="MVE-hx-Orw" firstAttribute="width" secondItem="N0I-7c-9U5" secondAttribute="width" id="0d2-xX-4nN"/> | ||
| 241 | + <constraint firstItem="VR5-78-Tv5" firstAttribute="centerY" secondItem="N0I-7c-9U5" secondAttribute="centerY" id="8EE-EE-sQZ"/> | ||
| 242 | + <constraint firstItem="VR5-78-Tv5" firstAttribute="centerX" secondItem="jyu-RM-z6z" secondAttribute="centerX" id="ApZ-Ak-yhy"/> | ||
| 243 | + <constraint firstItem="MVE-hx-Orw" firstAttribute="leading" secondItem="VR5-78-Tv5" secondAttribute="trailing" constant="8" id="Lc3-an-SXP"/> | ||
| 244 | + <constraint firstItem="VR5-78-Tv5" firstAttribute="leading" secondItem="N0I-7c-9U5" secondAttribute="trailing" constant="8" id="M3G-DW-MW4"/> | ||
| 245 | + <constraint firstAttribute="trailing" secondItem="MVE-hx-Orw" secondAttribute="trailing" constant="4" id="ZPh-Tc-zq2"/> | ||
| 246 | + <constraint firstAttribute="bottom" secondItem="VR5-78-Tv5" secondAttribute="bottom" constant="8" id="Zlx-sv-yGg"/> | ||
| 247 | + <constraint firstItem="N0I-7c-9U5" firstAttribute="leading" secondItem="jyu-RM-z6z" secondAttribute="leading" constant="4" id="fnf-ZI-7lR"/> | ||
| 248 | + <constraint firstAttribute="height" constant="50" id="pzL-9r-PEl"/> | ||
| 249 | + <constraint firstItem="MVE-hx-Orw" firstAttribute="centerY" secondItem="N0I-7c-9U5" secondAttribute="centerY" id="rRf-Bp-kiI"/> | ||
| 250 | + </constraints> | ||
| 251 | + </view> | ||
| 252 | + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="4U1-AM-dYP"> | ||
| 253 | + <rect key="frame" x="162" y="83.5" width="50" height="50"/> | ||
| 254 | + <constraints> | ||
| 255 | + <constraint firstAttribute="width" secondItem="4U1-AM-dYP" secondAttribute="height" multiplier="1:1" id="HVQ-X7-j64"/> | ||
| 256 | + <constraint firstAttribute="height" constant="50" id="nns-jU-6ym"/> | ||
| 257 | + </constraints> | ||
| 258 | + <state key="normal" backgroundImage="starLive"/> | ||
| 259 | + <connections> | ||
| 260 | + <action selector="playPauseClickAction:" destination="AG5-Hc-gbL" eventType="touchUpInside" id="0ya-jd-K9X"/> | ||
| 261 | + </connections> | ||
| 262 | + </button> | ||
| 263 | + </subviews> | ||
| 264 | + <gestureRecognizers/> | ||
| 265 | + <constraints> | ||
| 266 | + <constraint firstItem="MUs-SM-Frh" firstAttribute="top" secondItem="gtT-Mf-dIt" secondAttribute="bottom" constant="8" id="7TN-tG-rMh"/> | ||
| 267 | + <constraint firstAttribute="trailing" secondItem="gtT-Mf-dIt" secondAttribute="trailing" constant="8" id="IKl-bt-8xr"/> | ||
| 268 | + <constraint firstItem="xoR-0a-vkL" firstAttribute="top" secondItem="Thc-Nf-cbR" secondAttribute="top" constant="20" id="MZv-Tg-ytZ"/> | ||
| 269 | + <constraint firstItem="4U1-AM-dYP" firstAttribute="centerX" secondItem="Thc-Nf-cbR" secondAttribute="centerX" id="R3s-VU-viS"/> | ||
| 270 | + <constraint firstAttribute="bottom" secondItem="jyu-RM-z6z" secondAttribute="bottom" id="RDS-2i-FQc"/> | ||
| 271 | + <constraint firstItem="4U1-AM-dYP" firstAttribute="centerY" secondItem="Thc-Nf-cbR" secondAttribute="centerY" id="SLZ-s7-jFa"/> | ||
| 272 | + <constraint firstAttribute="trailing" secondItem="xoR-0a-vkL" secondAttribute="trailing" constant="8" id="SeC-Wb-vCU"/> | ||
| 273 | + <constraint firstItem="gtT-Mf-dIt" firstAttribute="top" secondItem="xoR-0a-vkL" secondAttribute="bottom" constant="8" id="Yw0-Dn-jnC"/> | ||
| 274 | + <constraint firstItem="jyu-RM-z6z" firstAttribute="leading" secondItem="Thc-Nf-cbR" secondAttribute="leading" id="ip2-Fm-2LR"/> | ||
| 275 | + <constraint firstAttribute="trailing" secondItem="MUs-SM-Frh" secondAttribute="trailing" constant="8" id="ngv-X0-VLJ"/> | ||
| 276 | + <constraint firstAttribute="trailing" secondItem="jyu-RM-z6z" secondAttribute="trailing" id="tnu-1J-WOD"/> | ||
| 277 | + <constraint firstAttribute="trailing" secondItem="gtT-Mf-dIt" secondAttribute="trailing" constant="8" id="vdh-FT-aA6"/> | ||
| 278 | + </constraints> | ||
| 279 | + </view> | ||
| 280 | + </subviews> | ||
| 281 | + <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/> | ||
| 282 | + <constraints> | ||
| 283 | + <constraint firstItem="Thc-Nf-cbR" firstAttribute="top" secondItem="jyA-tw-Uyk" secondAttribute="bottom" constant="-20" id="4xS-O5-iwu"/> | ||
| 284 | + <constraint firstItem="oH7-yb-GUD" firstAttribute="top" secondItem="Thc-Nf-cbR" secondAttribute="bottom" id="F8z-Oh-aZr"/> | ||
| 285 | + <constraint firstItem="Thc-Nf-cbR" firstAttribute="leading" secondItem="Rfl-kc-zCQ" secondAttribute="leading" id="YlV-yz-8b8"/> | ||
| 286 | + <constraint firstAttribute="trailing" secondItem="Thc-Nf-cbR" secondAttribute="trailing" id="x6F-Qq-L1a"/> | ||
| 287 | + </constraints> | ||
| 288 | + </view> | ||
| 289 | + <connections> | ||
| 290 | + <outlet property="endTime" destination="MVE-hx-Orw" id="r7b-wF-28o"/> | ||
| 291 | + <outlet property="pauseImageBtn" destination="4U1-AM-dYP" id="LcL-Wn-NKB"/> | ||
| 292 | + <outlet property="screenHorizontalBtn" destination="gtT-Mf-dIt" id="Zee-tI-mrf"/> | ||
| 293 | + <outlet property="slider" destination="VR5-78-Tv5" id="XJX-b6-dfx"/> | ||
| 294 | + <outlet property="startTime" destination="N0I-7c-9U5" id="QN8-hu-O3X"/> | ||
| 295 | + </connections> | ||
| 296 | + </viewController> | ||
| 297 | + <placeholder placeholderIdentifier="IBFirstResponder" id="Ado-Jr-Adu" userLabel="First Responder" sceneMemberID="firstResponder"/> | ||
| 298 | + </objects> | ||
| 299 | + <point key="canvasLocation" x="33" y="848"/> | ||
| 300 | + </scene> | ||
| 301 | + </scenes> | ||
| 302 | + <resources> | ||
| 303 | + <image name="closeAlive" width="33" height="33"/> | ||
| 304 | + <image name="defphoto.png" width="256" height="256"/> | ||
| 305 | + <image name="screen_full" width="33" height="33"/> | ||
| 306 | + <image name="starLive" width="22" height="22"/> | ||
| 307 | + </resources> | ||
| 10 | </document> | 308 | </document> |
YouerLiveVideo/YouerLiveVideo/controllers/TVStation/SearchTVStationListViewController.swift
| @@ -150,12 +150,12 @@ extension SearchTVStationListViewController:UITableViewDataSource,UITableViewDel | @@ -150,12 +150,12 @@ extension SearchTVStationListViewController:UITableViewDataSource,UITableViewDel | ||
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | func sectionIndexTitles(for tableView: UITableView) -> [String]? { | 152 | func sectionIndexTitles(for tableView: UITableView) -> [String]? { |
| 153 | - if tableView == selectTableView{ | ||
| 154 | - return [] | ||
| 155 | - }else{ | ||
| 156 | - return allKeys+["#"] | 153 | + if tableView != selectTableView{ |
| 154 | + if allKeys.count > 0{ | ||
| 155 | + return allKeys+["#"] | ||
| 156 | + } | ||
| 157 | } | 157 | } |
| 158 | - | 158 | + return [] |
| 159 | } | 159 | } |
| 160 | 160 | ||
| 161 | func numberOfSections(in tableView: UITableView) -> Int { | 161 | func numberOfSections(in tableView: UITableView) -> Int { |
| @@ -182,10 +182,6 @@ extension SearchTVStationListViewController:UITableViewDataSource,UITableViewDel | @@ -182,10 +182,6 @@ extension SearchTVStationListViewController:UITableViewDataSource,UITableViewDel | ||
| 182 | return 44 | 182 | return 44 |
| 183 | } | 183 | } |
| 184 | } | 184 | } |
| 185 | - | ||
| 186 | - func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { | ||
| 187 | - return 1 | ||
| 188 | - } | ||
| 189 | } | 185 | } |
| 190 | 186 | ||
| 191 | class SearchTVStationListCell: UITableViewCell { | 187 | class SearchTVStationListCell: UITableViewCell { |
YouerLiveVideo/YouerLiveVideo/controllers/TVStation/TVStation.storyboard
| @@ -145,29 +145,34 @@ | @@ -145,29 +145,34 @@ | ||
| 145 | <constraint firstItem="REy-qu-6cO" firstAttribute="centerX" secondItem="q0y-9I-pQG" secondAttribute="centerX" id="zoe-K7-XTj"/> | 145 | <constraint firstItem="REy-qu-6cO" firstAttribute="centerX" secondItem="q0y-9I-pQG" secondAttribute="centerX" id="zoe-K7-XTj"/> |
| 146 | </constraints> | 146 | </constraints> |
| 147 | </view> | 147 | </view> |
| 148 | - <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="123" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="o4U-1y-nqL"> | 148 | + <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="84" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="o4U-1y-nqL"> |
| 149 | <rect key="frame" x="0.0" y="92" width="375" height="575"/> | 149 | <rect key="frame" x="0.0" y="92" width="375" height="575"/> |
| 150 | <color key="backgroundColor" red="0.93503493069999999" green="0.93562394380000002" blue="0.96585971120000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | 150 | <color key="backgroundColor" red="0.93503493069999999" green="0.93562394380000002" blue="0.96585971120000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> |
| 151 | + <view key="tableFooterView" contentMode="scaleToFill" id="Ur7-JI-nZm"> | ||
| 152 | + <rect key="frame" x="0.0" y="112" width="375" height="1"/> | ||
| 153 | + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | ||
| 154 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | ||
| 155 | + </view> | ||
| 151 | <prototypes> | 156 | <prototypes> |
| 152 | - <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="cell" rowHeight="123" id="MMn-tR-I0v" customClass="SearchTVStationListCell" customModule="YouerLiveVideo" customModuleProvider="target"> | ||
| 153 | - <rect key="frame" x="0.0" y="28" width="375" height="123"/> | 157 | + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="cell" rowHeight="84" id="MMn-tR-I0v" customClass="SearchTVStationListCell" customModule="YouerLiveVideo" customModuleProvider="target"> |
| 158 | + <rect key="frame" x="0.0" y="28" width="375" height="84"/> | ||
| 154 | <autoresizingMask key="autoresizingMask"/> | 159 | <autoresizingMask key="autoresizingMask"/> |
| 155 | <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="MMn-tR-I0v" id="H7d-Zz-WAS"> | 160 | <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="MMn-tR-I0v" id="H7d-Zz-WAS"> |
| 156 | - <rect key="frame" x="0.0" y="0.0" width="375" height="122"/> | 161 | + <rect key="frame" x="0.0" y="0.0" width="375" height="83"/> |
| 157 | <autoresizingMask key="autoresizingMask"/> | 162 | <autoresizingMask key="autoresizingMask"/> |
| 158 | <subviews> | 163 | <subviews> |
| 159 | <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9Yk-8z-nas"> | 164 | <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9Yk-8z-nas"> |
| 160 | - <rect key="frame" x="8" y="4" width="359" height="114.5"/> | 165 | + <rect key="frame" x="8" y="4" width="359" height="75.5"/> |
| 161 | <subviews> | 166 | <subviews> |
| 162 | <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="IYQ-S7-ka2"> | 167 | <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="IYQ-S7-ka2"> |
| 163 | - <rect key="frame" x="8" y="33.5" width="80" height="48"/> | 168 | + <rect key="frame" x="8" y="14" width="80" height="48"/> |
| 164 | <constraints> | 169 | <constraints> |
| 165 | <constraint firstAttribute="width" constant="80" id="XKV-mN-TaH"/> | 170 | <constraint firstAttribute="width" constant="80" id="XKV-mN-TaH"/> |
| 166 | <constraint firstAttribute="width" secondItem="IYQ-S7-ka2" secondAttribute="height" multiplier="5:3" id="tZU-XC-3Mh"/> | 171 | <constraint firstAttribute="width" secondItem="IYQ-S7-ka2" secondAttribute="height" multiplier="5:3" id="tZU-XC-3Mh"/> |
| 167 | </constraints> | 172 | </constraints> |
| 168 | </imageView> | 173 | </imageView> |
| 169 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Lnl-RY-Pw3"> | 174 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Lnl-RY-Pw3"> |
| 170 | - <rect key="frame" x="96" y="47" width="42" height="21"/> | 175 | + <rect key="frame" x="96" y="27.5" width="42" height="21"/> |
| 171 | <fontDescription key="fontDescription" type="system" pointSize="17"/> | 176 | <fontDescription key="fontDescription" type="system" pointSize="17"/> |
| 172 | <nil key="textColor"/> | 177 | <nil key="textColor"/> |
| 173 | <nil key="highlightedColor"/> | 178 | <nil key="highlightedColor"/> |
| @@ -204,9 +209,14 @@ | @@ -204,9 +209,14 @@ | ||
| 204 | <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LO5-7p-BlF"> | 209 | <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LO5-7p-BlF"> |
| 205 | <rect key="frame" x="0.0" y="92" width="375" height="575"/> | 210 | <rect key="frame" x="0.0" y="92" width="375" height="575"/> |
| 206 | <subviews> | 211 | <subviews> |
| 207 | - <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="IbJ-62-QUz"> | 212 | + <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="IbJ-62-QUz"> |
| 208 | <rect key="frame" x="0.0" y="0.0" width="375" height="575"/> | 213 | <rect key="frame" x="0.0" y="0.0" width="375" height="575"/> |
| 209 | <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> | 214 | <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> |
| 215 | + <view key="tableFooterView" contentMode="scaleToFill" id="3xH-Ja-uTC"> | ||
| 216 | + <rect key="frame" x="0.0" y="72" width="375" height="1"/> | ||
| 217 | + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | ||
| 218 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | ||
| 219 | + </view> | ||
| 210 | <prototypes> | 220 | <prototypes> |
| 211 | <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="cell" id="1Ns-5p-fDD" customClass="SearchSelectCell" customModule="YouerLiveVideo" customModuleProvider="target"> | 221 | <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="cell" id="1Ns-5p-fDD" customClass="SearchSelectCell" customModule="YouerLiveVideo" customModuleProvider="target"> |
| 212 | <rect key="frame" x="0.0" y="28" width="375" height="44"/> | 222 | <rect key="frame" x="0.0" y="28" width="375" height="44"/> |
| @@ -239,7 +249,7 @@ | @@ -239,7 +249,7 @@ | ||
| 239 | </connections> | 249 | </connections> |
| 240 | </tableView> | 250 | </tableView> |
| 241 | </subviews> | 251 | </subviews> |
| 242 | - <color key="backgroundColor" white="0.66666666666666663" alpha="0.50786493288590606" colorSpace="calibratedWhite"/> | 252 | + <color key="backgroundColor" white="0.66666666669999997" alpha="0.50786493290000001" colorSpace="calibratedWhite"/> |
| 243 | <constraints> | 253 | <constraints> |
| 244 | <constraint firstItem="IbJ-62-QUz" firstAttribute="leading" secondItem="LO5-7p-BlF" secondAttribute="leading" id="JAu-J6-dIy"/> | 254 | <constraint firstItem="IbJ-62-QUz" firstAttribute="leading" secondItem="LO5-7p-BlF" secondAttribute="leading" id="JAu-J6-dIy"/> |
| 245 | <constraint firstAttribute="bottom" secondItem="IbJ-62-QUz" secondAttribute="bottom" id="JKF-1f-M6c"/> | 255 | <constraint firstAttribute="bottom" secondItem="IbJ-62-QUz" secondAttribute="bottom" id="JKF-1f-M6c"/> |
YouerLiveVideo/YouerLiveVideo/controllers/TVStation/TVStationViewController.swift
| @@ -150,6 +150,9 @@ extension TVStationViewController:UICollectionViewDelegate,UICollectionViewDeleg | @@ -150,6 +150,9 @@ extension TVStationViewController:UICollectionViewDelegate,UICollectionViewDeleg | ||
| 150 | let vc = Story.instantiateViewControllerWithIdentifier("TVStationInforViewControllerVC", storyName: "TVStation") as! TVStationInforViewController | 150 | let vc = Story.instantiateViewControllerWithIdentifier("TVStationInforViewControllerVC", storyName: "TVStation") as! TVStationInforViewController |
| 151 | vc.excellentTVStationProgram = excellentTVStationProgram[indexPath.row] | 151 | vc.excellentTVStationProgram = excellentTVStationProgram[indexPath.row] |
| 152 | self.navigationController?.pushViewController(vc, animated: true) | 152 | self.navigationController?.pushViewController(vc, animated: true) |
| 153 | + }else{ | ||
| 154 | + let vc = Story.instantiateViewControllerWithIdentifier("LiveInforViewControllerVC", storyName: "Resource") as! LiveInforViewController | ||
| 155 | + self.navigationController?.pushViewController(vc, animated: true) | ||
| 153 | } | 156 | } |
| 154 | } | 157 | } |
| 155 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { | 158 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { |
YouerLiveVideo/YouerLiveVideo/util/utiles.swift
| @@ -9,7 +9,11 @@ import UIKit | @@ -9,7 +9,11 @@ import UIKit | ||
| 9 | import Foundation | 9 | import Foundation |
| 10 | import Photos | 10 | import Photos |
| 11 | import QuickLook | 11 | import QuickLook |
| 12 | + | ||
| 13 | +let CGPointZero = CGPoint(x:0, y:0) | ||
| 14 | + | ||
| 12 | class AlertController { | 15 | class AlertController { |
| 16 | + | ||
| 13 | static func creatAlert(_ title:String)->UIAlertController{ | 17 | static func creatAlert(_ title:String)->UIAlertController{ |
| 14 | let alert = UIAlertController(title: "消息",message: title,preferredStyle: UIAlertControllerStyle.alert) | 18 | let alert = UIAlertController(title: "消息",message: title,preferredStyle: UIAlertControllerStyle.alert) |
| 15 | alert.addAction(UIAlertAction(title: "确定", style: .default, handler: { (action) in | 19 | alert.addAction(UIAlertAction(title: "确定", style: .default, handler: { (action) in |