Commit 0db1c538eaf192cb10b6e3960ef3ee8d7909283a
Exists in
newLive
Merge branch 'newLive' of http://git.shunzhi.net/iosgroup/newlive into newLive
Showing
9 changed files
with
1156 additions
and
65 deletions
Show diff stats
YouerLiveVideo/YouerLiveVideo.xcodeproj/project.pbxproj
@@ -47,6 +47,8 @@ | @@ -47,6 +47,8 @@ | ||
47 | 599B2CE21DE52F7E00B4F7FD /* UMSocialShareScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 599B2CD01DE52F7E00B4F7FD /* UMSocialShareScrollView.m */; }; | 47 | 599B2CE21DE52F7E00B4F7FD /* UMSocialShareScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 599B2CD01DE52F7E00B4F7FD /* UMSocialShareScrollView.m */; }; |
48 | 599B2CE31DE52F7E00B4F7FD /* UMSocialUIManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 599B2CD21DE52F7E00B4F7FD /* UMSocialUIManager.m */; }; | 48 | 599B2CE31DE52F7E00B4F7FD /* UMSocialUIManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 599B2CD21DE52F7E00B4F7FD /* UMSocialUIManager.m */; }; |
49 | 59AE3DF91ECE8A90003E2C62 /* pinyin.c in Sources */ = {isa = PBXBuildFile; fileRef = 59AE3DF71ECE8A90003E2C62 /* pinyin.c */; }; | 49 | 59AE3DF91ECE8A90003E2C62 /* pinyin.c in Sources */ = {isa = PBXBuildFile; fileRef = 59AE3DF71ECE8A90003E2C62 /* pinyin.c */; }; |
50 | + 59AE3DFB1ECECD7D003E2C62 /* LiveInforViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59AE3DFA1ECECD7D003E2C62 /* LiveInforViewController.swift */; }; | ||
51 | + 59AE3DFD1ECED5B1003E2C62 /* MoivePlayerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59AE3DFC1ECED5B1003E2C62 /* MoivePlayerViewController.swift */; }; | ||
50 | 59BA13251E25CF2B00540DE0 /* AliyunPlayerSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59BA13241E25CF2B00540DE0 /* AliyunPlayerSDK.framework */; }; | 52 | 59BA13251E25CF2B00540DE0 /* AliyunPlayerSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59BA13241E25CF2B00540DE0 /* AliyunPlayerSDK.framework */; }; |
51 | 59BA13271E25CF4B00540DE0 /* AliyunPlayerSDK.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 59BA13241E25CF2B00540DE0 /* AliyunPlayerSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; | 53 | 59BA13271E25CF4B00540DE0 /* AliyunPlayerSDK.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 59BA13241E25CF2B00540DE0 /* AliyunPlayerSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; |
52 | 59BA13311E25D1C000540DE0 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 59BA13301E25D1C000540DE0 /* Reachability.m */; }; | 54 | 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>"; }; |
@@ -616,6 +620,8 @@ | @@ -616,6 +620,8 @@ | ||
616 | isa = PBXGroup; | 620 | isa = PBXGroup; |
617 | children = ( | 621 | children = ( |
618 | 5904FC471ECA8B8C00E631FF /* ResourceViewController.swift */, | 622 | 5904FC471ECA8B8C00E631FF /* ResourceViewController.swift */, |
623 | + 59AE3DFA1ECECD7D003E2C62 /* LiveInforViewController.swift */, | ||
624 | + 59AE3DFC1ECED5B1003E2C62 /* MoivePlayerViewController.swift */, | ||
619 | 597185B41ECA990C00D7F478 /* Resource.storyboard */, | 625 | 597185B41ECA990C00D7F478 /* Resource.storyboard */, |
620 | ); | 626 | ); |
621 | path = Resource; | 627 | path = Resource; |
@@ -1501,6 +1507,7 @@ | @@ -1501,6 +1507,7 @@ | ||
1501 | BF25DFF31DDAA36A003EC0C1 /* Timeline.swift in Sources */, | 1507 | BF25DFF31DDAA36A003EC0C1 /* Timeline.swift in Sources */, |
1502 | BF25DFFE1DDAA36A003EC0C1 /* SDWebImageDownloader.m in Sources */, | 1508 | BF25DFFE1DDAA36A003EC0C1 /* SDWebImageDownloader.m in Sources */, |
1503 | BF7B75A51E305A6D0011D5C7 /* MJRefreshConst.m in Sources */, | 1509 | BF7B75A51E305A6D0011D5C7 /* MJRefreshConst.m in Sources */, |
1510 | + 59AE3DFB1ECECD7D003E2C62 /* LiveInforViewController.swift in Sources */, | ||
1504 | BF7B759B1E305A6D0011D5C7 /* MJRefreshAutoGifFooter.m in Sources */, | 1511 | BF7B759B1E305A6D0011D5C7 /* MJRefreshAutoGifFooter.m in Sources */, |
1505 | BF7B75A81E305A6D0011D5C7 /* UIScrollView+MJRefresh.m in Sources */, | 1512 | BF7B75A81E305A6D0011D5C7 /* UIScrollView+MJRefresh.m in Sources */, |
1506 | BF25E0021DDAA36A003EC0C1 /* UIButton+WebCache.m in Sources */, | 1513 | BF25E0021DDAA36A003EC0C1 /* UIButton+WebCache.m in Sources */, |
@@ -1515,6 +1522,7 @@ | @@ -1515,6 +1522,7 @@ | ||
1515 | BFDFDED21DD55C0D0040F102 /* network.swift in Sources */, | 1522 | BFDFDED21DD55C0D0040F102 /* network.swift in Sources */, |
1516 | 599B2CE11DE52F7E00B4F7FD /* UMShareMenuSelectionView.m in Sources */, | 1523 | 599B2CE11DE52F7E00B4F7FD /* UMShareMenuSelectionView.m in Sources */, |
1517 | BF25DFFF1DDAA36A003EC0C1 /* SDWebImageDownloaderOperation.m in Sources */, | 1524 | BF25DFFF1DDAA36A003EC0C1 /* SDWebImageDownloaderOperation.m in Sources */, |
1525 | + 59AE3DFD1ECED5B1003E2C62 /* MoivePlayerViewController.swift in Sources */, | ||
1518 | BF25DFF01DDAA36A003EC0C1 /* SessionDelegate.swift in Sources */, | 1526 | BF25DFF01DDAA36A003EC0C1 /* SessionDelegate.swift in Sources */, |
1519 | BF25DFE31DDAA36A003EC0C1 /* Alamofire.swift in Sources */, | 1527 | BF25DFE31DDAA36A003EC0C1 /* Alamofire.swift in Sources */, |
1520 | BF25DFEC1DDAA36A003EC0C1 /* Response.swift in Sources */, | 1528 | BF25DFEC1DDAA36A003EC0C1 /* Response.swift in Sources */, |
YouerLiveVideo/YouerLiveVideo/Base.lproj/Main.storyboard
1 | -<?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
2 | -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11762" systemVersion="15G1217" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="fhe-aI-EYq"> | 1 | +<?xml version="1.0" encoding="UTF-8"?> |
2 | +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11762" systemVersion="16A323" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="fhe-aI-EYq"> | ||
3 | <device id="retina4_7" orientation="portrait"> | 3 | <device id="retina4_7" orientation="portrait"> |
4 | <adaptation id="fullscreen"/> | 4 | <adaptation id="fullscreen"/> |
5 | </device> | 5 | </device> |
@@ -42,9 +42,8 @@ | @@ -42,9 +42,8 @@ | ||
42 | <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> | 42 | <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> |
43 | <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | 43 | <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> |
44 | <subviews> | 44 | <subviews> |
45 | - <tableView clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="143" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="su6-Ve-Mu4"> | ||
46 | - <rect key="frame" x="0.0" y="64" width="375" height="554"/> | ||
47 | - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | 45 | + <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="143" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="su6-Ve-Mu4"> |
46 | + <rect key="frame" x="0.0" y="158" width="375" height="460"/> | ||
48 | <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | 47 | <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> |
49 | <prototypes> | 48 | <prototypes> |
50 | <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="cell" rowHeight="143" id="tO9-FG-1Ux" customClass="ResourceViewControllerTableViewCell" customModule="YouerLiveVideo" customModuleProvider="target"> | 49 | <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="cell" rowHeight="143" id="tO9-FG-1Ux" customClass="ResourceViewControllerTableViewCell" customModule="YouerLiveVideo" customModuleProvider="target"> |
@@ -54,41 +53,71 @@ | @@ -54,41 +53,71 @@ | ||
54 | <rect key="frame" x="0.0" y="0.0" width="375" height="142"/> | 53 | <rect key="frame" x="0.0" y="0.0" width="375" height="142"/> |
55 | <autoresizingMask key="autoresizingMask"/> | 54 | <autoresizingMask key="autoresizingMask"/> |
56 | <subviews> | 55 | <subviews> |
57 | - <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="9sK-3H-gLf"> | ||
58 | - <rect key="frame" x="4" y="4" width="367" height="135"/> | ||
59 | - <collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" minimumLineSpacing="0.0" minimumInteritemSpacing="0.0" id="NNX-1c-rMt"> | ||
60 | - <size key="itemSize" width="110" height="136"/> | ||
61 | - <size key="headerReferenceSize" width="0.0" height="0.0"/> | ||
62 | - <size key="footerReferenceSize" width="0.0" height="0.0"/> | ||
63 | - <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/> | ||
64 | - </collectionViewFlowLayout> | ||
65 | - <cells> | ||
66 | - <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="cell" id="uaR-ln-uvy" customClass="ResourceViewControllerCollectionCell" customModule="YouerLiveVideo" customModuleProvider="target"> | ||
67 | - <rect key="frame" x="0.0" y="-1" width="110" height="136"/> | ||
68 | - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | ||
69 | - <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center"> | ||
70 | - <rect key="frame" x="0.0" y="0.0" width="110" height="136"/> | ||
71 | - <autoresizingMask key="autoresizingMask"/> | ||
72 | - <subviews> | ||
73 | - <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ScQ-3J-2Hk"> | ||
74 | - <rect key="frame" x="4" y="6" width="102" height="125"/> | ||
75 | - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | ||
76 | - </imageView> | ||
77 | - </subviews> | ||
78 | - </view> | ||
79 | - </collectionViewCell> | ||
80 | - </cells> | ||
81 | - <connections> | ||
82 | - <outlet property="dataSource" destination="xEc-U1-QCp" id="a1A-by-AeW"/> | ||
83 | - <outlet property="delegate" destination="xEc-U1-QCp" id="ffU-FU-eXy"/> | ||
84 | - </connections> | ||
85 | - </collectionView> | 56 | + <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="fqH-Ro-Yhh"> |
57 | + <rect key="frame" x="8" y="26.5" width="90" height="90"/> | ||
58 | + <constraints> | ||
59 | + <constraint firstAttribute="width" constant="90" id="1QK-QU-Ukp"/> | ||
60 | + <constraint firstAttribute="width" secondItem="fqH-Ro-Yhh" secondAttribute="height" multiplier="1:1" id="6mr-C4-eMc"/> | ||
61 | + </constraints> | ||
62 | + </imageView> | ||
63 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FNV-Qr-xrm"> | ||
64 | + <rect key="frame" x="114" y="32" width="42" height="21"/> | ||
65 | + <fontDescription key="fontDescription" type="system" pointSize="17"/> | ||
66 | + <nil key="textColor"/> | ||
67 | + <nil key="highlightedColor"/> | ||
68 | + </label> | ||
69 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IQj-VB-dch"> | ||
70 | + <rect key="frame" x="114" y="61" width="42" height="21"/> | ||
71 | + <fontDescription key="fontDescription" type="system" pointSize="17"/> | ||
72 | + <color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/> | ||
73 | + <nil key="highlightedColor"/> | ||
74 | + </label> | ||
75 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WIc-YL-RvX"> | ||
76 | + <rect key="frame" x="114" y="90" width="42" height="21"/> | ||
77 | + <fontDescription key="fontDescription" type="system" pointSize="17"/> | ||
78 | + <color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/> | ||
79 | + <nil key="highlightedColor"/> | ||
80 | + </label> | ||
81 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="paA-9W-bbM"> | ||
82 | + <rect key="frame" x="325" y="90" width="42" height="21"/> | ||
83 | + <fontDescription key="fontDescription" type="system" pointSize="17"/> | ||
84 | + <nil key="textColor"/> | ||
85 | + <nil key="highlightedColor"/> | ||
86 | + </label> | ||
87 | + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yx0-8F-VaM"> | ||
88 | + <rect key="frame" x="287" y="25.5" width="80" height="35"/> | ||
89 | + <color key="backgroundColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="calibratedRGB"/> | ||
90 | + <constraints> | ||
91 | + <constraint firstAttribute="height" constant="35" id="Jva-gB-kRb"/> | ||
92 | + <constraint firstAttribute="width" constant="80" id="gQ6-au-k70"/> | ||
93 | + </constraints> | ||
94 | + <state key="normal" title="预览"> | ||
95 | + <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||
96 | + </state> | ||
97 | + </button> | ||
98 | + <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="ds9-Gw-nOf"> | ||
99 | + <rect key="frame" x="297" y="90.5" width="20" height="20"/> | ||
100 | + <constraints> | ||
101 | + <constraint firstAttribute="width" secondItem="ds9-Gw-nOf" secondAttribute="height" multiplier="1:1" id="Mto-fo-vVR"/> | ||
102 | + <constraint firstAttribute="width" constant="20" id="jkd-ZW-KU3"/> | ||
103 | + </constraints> | ||
104 | + </imageView> | ||
86 | </subviews> | 105 | </subviews> |
87 | <constraints> | 106 | <constraints> |
88 | - <constraint firstItem="9sK-3H-gLf" firstAttribute="top" secondItem="73f-qf-61d" secondAttribute="top" constant="4" id="6J6-RM-oGR"/> | ||
89 | - <constraint firstAttribute="trailing" secondItem="9sK-3H-gLf" secondAttribute="trailing" constant="4" id="KEJ-kK-2M8"/> | ||
90 | - <constraint firstAttribute="bottom" secondItem="9sK-3H-gLf" secondAttribute="bottom" constant="4" id="ZRA-Gv-88C"/> | ||
91 | - <constraint firstItem="9sK-3H-gLf" firstAttribute="leading" secondItem="73f-qf-61d" secondAttribute="leading" constant="4" id="nIl-dG-Xgk"/> | 107 | + <constraint firstAttribute="trailing" secondItem="paA-9W-bbM" secondAttribute="trailing" constant="8" id="0A4-Eu-BpA"/> |
108 | + <constraint firstItem="IQj-VB-dch" firstAttribute="top" secondItem="FNV-Qr-xrm" secondAttribute="bottom" constant="8" id="3Z2-jm-Rfu"/> | ||
109 | + <constraint firstItem="WIc-YL-RvX" firstAttribute="leading" secondItem="fqH-Ro-Yhh" secondAttribute="trailing" constant="16" id="AiJ-mm-qpS"/> | ||
110 | + <constraint firstItem="yx0-8F-VaM" firstAttribute="centerY" secondItem="FNV-Qr-xrm" secondAttribute="centerY" id="Dwv-nR-Ane"/> | ||
111 | + <constraint firstItem="fqH-Ro-Yhh" firstAttribute="centerY" secondItem="73f-qf-61d" secondAttribute="centerY" id="IGh-UO-Bar"/> | ||
112 | + <constraint firstItem="paA-9W-bbM" firstAttribute="centerY" secondItem="WIc-YL-RvX" secondAttribute="centerY" id="Me2-Im-Vc9"/> | ||
113 | + <constraint firstItem="fqH-Ro-Yhh" firstAttribute="leading" secondItem="73f-qf-61d" secondAttribute="leading" constant="8" id="Zty-O7-8xT"/> | ||
114 | + <constraint firstItem="IQj-VB-dch" firstAttribute="centerY" secondItem="73f-qf-61d" secondAttribute="centerY" id="emm-la-YJV"/> | ||
115 | + <constraint firstItem="paA-9W-bbM" firstAttribute="leading" secondItem="ds9-Gw-nOf" secondAttribute="trailing" constant="8" id="g70-bh-6yw"/> | ||
116 | + <constraint firstItem="IQj-VB-dch" firstAttribute="leading" secondItem="FNV-Qr-xrm" secondAttribute="leading" id="hRh-iw-dub"/> | ||
117 | + <constraint firstItem="WIc-YL-RvX" firstAttribute="leading" secondItem="FNV-Qr-xrm" secondAttribute="leading" id="lPb-2C-esz"/> | ||
118 | + <constraint firstItem="WIc-YL-RvX" firstAttribute="top" secondItem="IQj-VB-dch" secondAttribute="bottom" constant="8" id="nOs-ak-tnd"/> | ||
119 | + <constraint firstItem="ds9-Gw-nOf" firstAttribute="centerY" secondItem="WIc-YL-RvX" secondAttribute="centerY" id="nu7-SQ-hzc"/> | ||
120 | + <constraint firstAttribute="trailing" secondItem="yx0-8F-VaM" secondAttribute="trailing" constant="8" id="pBd-Lh-bTy"/> | ||
92 | </constraints> | 121 | </constraints> |
93 | </tableViewCellContentView> | 122 | </tableViewCellContentView> |
94 | </tableViewCell> | 123 | </tableViewCell> |
@@ -98,14 +127,69 @@ | @@ -98,14 +127,69 @@ | ||
98 | <outlet property="delegate" destination="xEc-U1-QCp" id="iof-1s-GH1"/> | 127 | <outlet property="delegate" destination="xEc-U1-QCp" id="iof-1s-GH1"/> |
99 | </connections> | 128 | </connections> |
100 | </tableView> | 129 | </tableView> |
130 | + <searchBar contentMode="redraw" placeholder="搜索" translatesAutoresizingMaskIntoConstraints="NO" id="yoD-X2-JQ0"> | ||
131 | + <rect key="frame" x="0.0" y="64" width="375" height="44"/> | ||
132 | + <textInputTraits key="textInputTraits"/> | ||
133 | + </searchBar> | ||
134 | + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="za5-9d-anp"> | ||
135 | + <rect key="frame" x="0.0" y="108" width="375" height="50"/> | ||
136 | + <subviews> | ||
137 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text=" " textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mgQ-3C-amN"> | ||
138 | + <rect key="frame" x="8" y="17" width="4" height="18"/> | ||
139 | + <fontDescription key="fontDescription" type="system" pointSize="15"/> | ||
140 | + <nil key="textColor"/> | ||
141 | + <nil key="highlightedColor"/> | ||
142 | + </label> | ||
143 | + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fz6-VO-SIi"> | ||
144 | + <rect key="frame" x="310" y="10" width="57" height="30"/> | ||
145 | + <constraints> | ||
146 | + <constraint firstAttribute="height" constant="30" id="NCP-Ag-7c1"/> | ||
147 | + </constraints> | ||
148 | + <fontDescription key="fontDescription" type="system" pointSize="17"/> | ||
149 | + <state key="normal" title="筛选" image="starLive"> | ||
150 | + <color key="titleColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||
151 | + </state> | ||
152 | + </button> | ||
153 | + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="a7C-jD-YSJ"> | ||
154 | + <rect key="frame" x="245" y="14" width="57" height="22"/> | ||
155 | + <fontDescription key="fontDescription" type="system" pointSize="17"/> | ||
156 | + <state key="normal" title="排序" image="starLive"> | ||
157 | + <color key="titleColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||
158 | + </state> | ||
159 | + </button> | ||
160 | + </subviews> | ||
161 | + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||
162 | + <constraints> | ||
163 | + <constraint firstItem="fz6-VO-SIi" firstAttribute="leading" secondItem="a7C-jD-YSJ" secondAttribute="trailing" constant="8" id="AqG-KK-VAP"/> | ||
164 | + <constraint firstItem="a7C-jD-YSJ" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="mgQ-3C-amN" secondAttribute="trailing" constant="8" id="HcO-bM-kZo"/> | ||
165 | + <constraint firstAttribute="trailing" secondItem="fz6-VO-SIi" secondAttribute="trailing" constant="8" id="QzD-Ci-dUo"/> | ||
166 | + <constraint firstItem="a7C-jD-YSJ" firstAttribute="centerY" secondItem="za5-9d-anp" secondAttribute="centerY" id="e22-SY-dro"/> | ||
167 | + <constraint firstItem="fz6-VO-SIi" firstAttribute="centerY" secondItem="za5-9d-anp" secondAttribute="centerY" id="qBE-uD-fE1"/> | ||
168 | + <constraint firstItem="mgQ-3C-amN" firstAttribute="centerY" secondItem="za5-9d-anp" secondAttribute="centerY" id="uMv-pj-P7r"/> | ||
169 | + <constraint firstAttribute="height" constant="50" id="xiw-nW-gnr"/> | ||
170 | + <constraint firstItem="mgQ-3C-amN" firstAttribute="leading" secondItem="za5-9d-anp" secondAttribute="leading" constant="8" id="yW6-qE-tfE"/> | ||
171 | + </constraints> | ||
172 | + </view> | ||
101 | </subviews> | 173 | </subviews> |
102 | - <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | 174 | + <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/> |
175 | + <constraints> | ||
176 | + <constraint firstItem="isx-D9-RKA" firstAttribute="top" secondItem="su6-Ve-Mu4" secondAttribute="bottom" id="0dH-vT-0L7"/> | ||
177 | + <constraint firstItem="yoD-X2-JQ0" firstAttribute="leading" secondItem="SdC-Ao-cee" secondAttribute="leading" id="2P3-aV-09x"/> | ||
178 | + <constraint firstAttribute="trailing" secondItem="yoD-X2-JQ0" secondAttribute="trailing" id="3gn-Jp-76Y"/> | ||
179 | + <constraint firstAttribute="trailing" secondItem="su6-Ve-Mu4" secondAttribute="trailing" id="Bce-ui-FBr"/> | ||
180 | + <constraint firstItem="su6-Ve-Mu4" firstAttribute="top" secondItem="za5-9d-anp" secondAttribute="bottom" id="Cug-lI-DhS"/> | ||
181 | + <constraint firstItem="za5-9d-anp" firstAttribute="top" secondItem="yoD-X2-JQ0" secondAttribute="bottom" id="Ine-er-3FG"/> | ||
182 | + <constraint firstAttribute="trailing" secondItem="za5-9d-anp" secondAttribute="trailing" id="VI2-tz-hSe"/> | ||
183 | + <constraint firstItem="yoD-X2-JQ0" firstAttribute="top" secondItem="vr1-kJ-xH9" secondAttribute="bottom" id="XUd-hg-GGA"/> | ||
184 | + <constraint firstItem="za5-9d-anp" firstAttribute="leading" secondItem="SdC-Ao-cee" secondAttribute="leading" id="qdI-Q1-1Sk"/> | ||
185 | + <constraint firstItem="su6-Ve-Mu4" firstAttribute="leading" secondItem="SdC-Ao-cee" secondAttribute="leading" id="ydL-OO-314"/> | ||
186 | + </constraints> | ||
103 | </view> | 187 | </view> |
104 | <navigationItem key="navigationItem" id="fCE-jD-MLQ"/> | 188 | <navigationItem key="navigationItem" id="fCE-jD-MLQ"/> |
105 | </viewController> | 189 | </viewController> |
106 | <placeholder placeholderIdentifier="IBFirstResponder" id="ksp-rg-C8h" userLabel="First Responder" sceneMemberID="firstResponder"/> | 190 | <placeholder placeholderIdentifier="IBFirstResponder" id="ksp-rg-C8h" userLabel="First Responder" sceneMemberID="firstResponder"/> |
107 | </objects> | 191 | </objects> |
108 | - <point key="canvasLocation" x="-1084" y="2113"/> | 192 | + <point key="canvasLocation" x="-1084" y="2112.5937031484259"/> |
109 | </scene> | 193 | </scene> |
110 | <!--Main Home Table View Controller--> | 194 | <!--Main Home Table View Controller--> |
111 | <scene sceneID="Npa-Do-pvj"> | 195 | <scene sceneID="Npa-Do-pvj"> |
@@ -697,12 +781,6 @@ | @@ -697,12 +781,6 @@ | ||
697 | <!--用户--> | 781 | <!--用户--> |
698 | <scene sceneID="LVY-SG-ceP"> | 782 | <scene sceneID="LVY-SG-ceP"> |
699 | <objects> | 783 | <objects> |
700 | - <tapGestureRecognizer id="crA-lr-1r9"> | ||
701 | - <connections> | ||
702 | - <action selector="photoImageTapAction:" destination="Xoa-Fo-2KW" id="bF5-5i-BIt"/> | ||
703 | - </connections> | ||
704 | - </tapGestureRecognizer> | ||
705 | - <placeholder placeholderIdentifier="IBFirstResponder" id="F06-ml-zgU" sceneMemberID="firstResponder"/> | ||
706 | <viewController id="Xoa-Fo-2KW" customClass="MyViewController" customModule="YouerLiveVideo" customModuleProvider="target" sceneMemberID="viewController"> | 784 | <viewController id="Xoa-Fo-2KW" customClass="MyViewController" customModule="YouerLiveVideo" customModuleProvider="target" sceneMemberID="viewController"> |
707 | <layoutGuides> | 785 | <layoutGuides> |
708 | <viewControllerLayoutGuide type="top" id="aLD-cx-0Aw"/> | 786 | <viewControllerLayoutGuide type="top" id="aLD-cx-0Aw"/> |
@@ -902,6 +980,12 @@ | @@ -902,6 +980,12 @@ | ||
902 | <outlet property="userView" destination="rEx-Nd-HXY" id="VMZ-Pf-hh9"/> | 980 | <outlet property="userView" destination="rEx-Nd-HXY" id="VMZ-Pf-hh9"/> |
903 | </connections> | 981 | </connections> |
904 | </viewController> | 982 | </viewController> |
983 | + <tapGestureRecognizer id="crA-lr-1r9"> | ||
984 | + <connections> | ||
985 | + <action selector="photoImageTapAction:" destination="Xoa-Fo-2KW" id="bF5-5i-BIt"/> | ||
986 | + </connections> | ||
987 | + </tapGestureRecognizer> | ||
988 | + <placeholder placeholderIdentifier="IBFirstResponder" id="F06-ml-zgU" sceneMemberID="firstResponder"/> | ||
905 | </objects> | 989 | </objects> |
906 | <point key="canvasLocation" x="362" y="-179"/> | 990 | <point key="canvasLocation" x="362" y="-179"/> |
907 | </scene> | 991 | </scene> |
@@ -1161,6 +1245,7 @@ | @@ -1161,6 +1245,7 @@ | ||
1161 | <image name="divshadow.png" width="771" height="13"/> | 1245 | <image name="divshadow.png" width="771" height="13"/> |
1162 | <image name="icon" width="512" height="512"/> | 1246 | <image name="icon" width="512" height="512"/> |
1163 | <image name="icon.png" width="80" height="80"/> | 1247 | <image name="icon.png" width="80" height="80"/> |
1248 | + <image name="starLive" width="22" height="22"/> | ||
1164 | <image name="视窗.png" width="31" height="31"/> | 1249 | <image name="视窗.png" width="31" height="31"/> |
1165 | <image name="首页.png" width="31" height="31"/> | 1250 | <image name="首页.png" width="31" height="31"/> |
1166 | </resources> | 1251 | </resources> |
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 |