Commit fa0078e1fd833bf3cfd11d7863c344fa6f02ed53
1 parent
349ae761
Exists in
newLive
资源排序筛选界面教材,目录搭建及数据处理,资源搜索方法实现。
Showing
15 changed files
with
652 additions
and
63 deletions
Show diff stats
YouerLiveVideo/YouerLiveVideo.xcodeproj/project.pbxproj
... | ... | @@ -150,6 +150,9 @@ |
150 | 150 | BF7722F91ED3C3E900226D44 /* FilterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF7722F81ED3C3E900226D44 /* FilterView.swift */; }; |
151 | 151 | BF7722FC1ED3C54B00226D44 /* FilterCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF7722FA1ED3C54B00226D44 /* FilterCollectionViewCell.swift */; }; |
152 | 152 | BF7722FD1ED3C54B00226D44 /* FilterCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BF7722FB1ED3C54B00226D44 /* FilterCollectionViewCell.xib */; }; |
153 | + BF7723011ED5660000226D44 /* FilterFootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF7723001ED5660000226D44 /* FilterFootView.swift */; }; | |
154 | + BF7723031ED5661F00226D44 /* FilterFootView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BF7723021ED5661F00226D44 /* FilterFootView.xib */; }; | |
155 | + BF7723051ED5667500226D44 /* FilterListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF7723041ED5667500226D44 /* FilterListViewController.swift */; }; | |
153 | 156 | BF7B75961E305A6D0011D5C7 /* MJRefreshAutoFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = BF7B756A1E305A6D0011D5C7 /* MJRefreshAutoFooter.m */; }; |
154 | 157 | BF7B75971E305A6D0011D5C7 /* MJRefreshBackFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = BF7B756C1E305A6D0011D5C7 /* MJRefreshBackFooter.m */; }; |
155 | 158 | BF7B75981E305A6D0011D5C7 /* MJRefreshComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = BF7B756E1E305A6D0011D5C7 /* MJRefreshComponent.m */; }; |
... | ... | @@ -480,6 +483,9 @@ |
480 | 483 | BF7722F81ED3C3E900226D44 /* FilterView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilterView.swift; sourceTree = "<group>"; }; |
481 | 484 | BF7722FA1ED3C54B00226D44 /* FilterCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilterCollectionViewCell.swift; sourceTree = "<group>"; }; |
482 | 485 | BF7722FB1ED3C54B00226D44 /* FilterCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FilterCollectionViewCell.xib; sourceTree = "<group>"; }; |
486 | + BF7723001ED5660000226D44 /* FilterFootView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilterFootView.swift; sourceTree = "<group>"; }; | |
487 | + BF7723021ED5661F00226D44 /* FilterFootView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FilterFootView.xib; sourceTree = "<group>"; }; | |
488 | + BF7723041ED5667500226D44 /* FilterListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilterListViewController.swift; sourceTree = "<group>"; }; | |
483 | 489 | BF7B75691E305A6D0011D5C7 /* MJRefreshAutoFooter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshAutoFooter.h; sourceTree = "<group>"; }; |
484 | 490 | BF7B756A1E305A6D0011D5C7 /* MJRefreshAutoFooter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshAutoFooter.m; sourceTree = "<group>"; }; |
485 | 491 | BF7B756B1E305A6D0011D5C7 /* MJRefreshBackFooter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshBackFooter.h; sourceTree = "<group>"; }; |
... | ... | @@ -643,6 +649,7 @@ |
643 | 649 | children = ( |
644 | 650 | 5904FC471ECA8B8C00E631FF /* ResourceViewController.swift */, |
645 | 651 | BF7722F21ED283D400226D44 /* FilterViewController.swift */, |
652 | + BF7723041ED5667500226D44 /* FilterListViewController.swift */, | |
646 | 653 | 59AE3DFA1ECECD7D003E2C62 /* LiveInforViewController.swift */, |
647 | 654 | 59AE3DFC1ECED5B1003E2C62 /* MoivePlayerViewController.swift */, |
648 | 655 | 597185B41ECA990C00D7F478 /* Resource.storyboard */, |
... | ... | @@ -1086,6 +1093,8 @@ |
1086 | 1093 | BF7722F61ED3C3CD00226D44 /* FilterView.xib */, |
1087 | 1094 | BF7722FA1ED3C54B00226D44 /* FilterCollectionViewCell.swift */, |
1088 | 1095 | BF7722FB1ED3C54B00226D44 /* FilterCollectionViewCell.xib */, |
1096 | + BF7723001ED5660000226D44 /* FilterFootView.swift */, | |
1097 | + BF7723021ED5661F00226D44 /* FilterFootView.xib */, | |
1089 | 1098 | ); |
1090 | 1099 | path = View; |
1091 | 1100 | sourceTree = "<group>"; |
... | ... | @@ -1462,6 +1471,7 @@ |
1462 | 1471 | 599B2CD51DE52F7E00B4F7FD /* TencentOpenApi_IOS_Bundle.bundle in Resources */, |
1463 | 1472 | BFBB83EA1ECC445D008B404B /* User.storyboard in Resources */, |
1464 | 1473 | 597185B51ECA990C00D7F478 /* Resource.storyboard in Resources */, |
1474 | + BF7723031ED5661F00226D44 /* FilterFootView.xib in Resources */, | |
1465 | 1475 | BF25DFE61DDAA36A003EC0C1 /* Info.plist in Resources */, |
1466 | 1476 | BFF5F4771DD5AA5C00D33B89 /* 上传头像.png in Resources */, |
1467 | 1477 | 5904FC501ECA8B8C00E631FF /* TVStation.storyboard in Resources */, |
... | ... | @@ -1566,6 +1576,7 @@ |
1566 | 1576 | 59AE3DFB1ECECD7D003E2C62 /* LiveInforViewController.swift in Sources */, |
1567 | 1577 | BF7B759B1E305A6D0011D5C7 /* MJRefreshAutoGifFooter.m in Sources */, |
1568 | 1578 | BF7B75A81E305A6D0011D5C7 /* UIScrollView+MJRefresh.m in Sources */, |
1579 | + BF7723011ED5660000226D44 /* FilterFootView.swift in Sources */, | |
1569 | 1580 | BF25E0021DDAA36A003EC0C1 /* UIButton+WebCache.m in Sources */, |
1570 | 1581 | BF7B759E1E305A6D0011D5C7 /* MJRefreshBackGifFooter.m in Sources */, |
1571 | 1582 | 59AE3DF91ECE8A90003E2C62 /* pinyin.c in Sources */, |
... | ... | @@ -1582,6 +1593,7 @@ |
1582 | 1593 | BF25DFFF1DDAA36A003EC0C1 /* SDWebImageDownloaderOperation.m in Sources */, |
1583 | 1594 | 59AE3DFD1ECED5B1003E2C62 /* MoivePlayerViewController.swift in Sources */, |
1584 | 1595 | BF25DFF01DDAA36A003EC0C1 /* SessionDelegate.swift in Sources */, |
1596 | + BF7723051ED5667500226D44 /* FilterListViewController.swift in Sources */, | |
1585 | 1597 | BF25DFE31DDAA36A003EC0C1 /* Alamofire.swift in Sources */, |
1586 | 1598 | BF25DFEC1DDAA36A003EC0C1 /* Response.swift in Sources */, |
1587 | 1599 | BF7B75961E305A6D0011D5C7 /* MJRefreshAutoFooter.m in Sources */, | ... | ... |
YouerLiveVideo/YouerLiveVideo/Assets.xcassets/z_NewIcon/Resource/Contents.json
0 → 100644
YouerLiveVideo/YouerLiveVideo/Assets.xcassets/z_NewIcon/Resource/resource_diselect.imageset/Contents.json
0 → 100644
... | ... | @@ -0,0 +1,21 @@ |
1 | +{ | |
2 | + "images" : [ | |
3 | + { | |
4 | + "idiom" : "universal", | |
5 | + "scale" : "1x" | |
6 | + }, | |
7 | + { | |
8 | + "idiom" : "universal", | |
9 | + "filename" : "cb48.png", | |
10 | + "scale" : "2x" | |
11 | + }, | |
12 | + { | |
13 | + "idiom" : "universal", | |
14 | + "scale" : "3x" | |
15 | + } | |
16 | + ], | |
17 | + "info" : { | |
18 | + "version" : 1, | |
19 | + "author" : "xcode" | |
20 | + } | |
21 | +} | |
0 | 22 | \ No newline at end of file | ... | ... |
YouerLiveVideo/YouerLiveVideo/Assets.xcassets/z_NewIcon/Resource/resource_diselect.imageset/cb48.png
0 → 100644
1.94 KB
YouerLiveVideo/YouerLiveVideo/Assets.xcassets/z_NewIcon/Resource/resource_select.imageset/Contents.json
0 → 100644
... | ... | @@ -0,0 +1,21 @@ |
1 | +{ | |
2 | + "images" : [ | |
3 | + { | |
4 | + "idiom" : "universal", | |
5 | + "scale" : "1x" | |
6 | + }, | |
7 | + { | |
8 | + "idiom" : "universal", | |
9 | + "filename" : "gou.png", | |
10 | + "scale" : "2x" | |
11 | + }, | |
12 | + { | |
13 | + "idiom" : "universal", | |
14 | + "scale" : "3x" | |
15 | + } | |
16 | + ], | |
17 | + "info" : { | |
18 | + "version" : 1, | |
19 | + "author" : "xcode" | |
20 | + } | |
21 | +} | |
0 | 22 | \ No newline at end of file | ... | ... |
YouerLiveVideo/YouerLiveVideo/Assets.xcassets/z_NewIcon/Resource/resource_select.imageset/gou.png
0 → 100644
2.73 KB
YouerLiveVideo/YouerLiveVideo/Base.lproj/Main.storyboard
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"> | |
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"> | |
3 | 3 | <device id="retina4_7" orientation="portrait"> |
4 | 4 | <adaptation id="fullscreen"/> |
5 | 5 | </device> |
... | ... | @@ -179,7 +179,7 @@ |
179 | 179 | <constraint firstAttribute="height" constant="44" id="PWr-Wf-TcS"/> |
180 | 180 | </constraints> |
181 | 181 | <prototypes> |
182 | - <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="cell" id="vmV-r2-2pv"> | |
182 | + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="cell" id="vmV-r2-2pv"> | |
183 | 183 | <rect key="frame" x="0.0" y="28" width="375" height="44"/> |
184 | 184 | <autoresizingMask key="autoresizingMask"/> |
185 | 185 | <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="vmV-r2-2pv" id="tft-RM-f2B"> |
... | ... | @@ -1430,6 +1430,9 @@ |
1430 | 1430 | <state key="normal" title="筛选" image="starLive"> |
1431 | 1431 | <color key="titleColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> |
1432 | 1432 | </state> |
1433 | + <connections> | |
1434 | + <action selector="jumpFilterVCAction:" destination="VUr-8w-9Ht" eventType="touchUpInside" id="Po2-Wd-wOq"/> | |
1435 | + </connections> | |
1433 | 1436 | </button> |
1434 | 1437 | <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="T2j-JJ-ft5"> |
1435 | 1438 | <rect key="frame" x="245" y="14" width="57" height="22"/> |
... | ... | @@ -1568,7 +1571,7 @@ |
1568 | 1571 | <constraint firstAttribute="height" constant="44" id="s3i-TZ-HsX"/> |
1569 | 1572 | </constraints> |
1570 | 1573 | <prototypes> |
1571 | - <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="cell" id="OoX-sY-EJ0"> | |
1574 | + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="cell" id="OoX-sY-EJ0"> | |
1572 | 1575 | <rect key="frame" x="0.0" y="28" width="375" height="44"/> |
1573 | 1576 | <autoresizingMask key="autoresizingMask"/> |
1574 | 1577 | <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="OoX-sY-EJ0" id="cE2-H1-hR9"> | ... | ... |
YouerLiveVideo/YouerLiveVideo/controllers/HomePage/MainHomeTableViewController.swift
... | ... | @@ -7,7 +7,7 @@ |
7 | 7 | // |
8 | 8 | |
9 | 9 | import UIKit |
10 | - | |
10 | +import AVKit | |
11 | 11 | class MainHomeTableViewController: UITableViewController { |
12 | 12 | @IBOutlet var tableHeaderView: UIView! |
13 | 13 | let current=AppDelegate.instance().accountManager |
... | ... | @@ -113,6 +113,15 @@ class MainHomeTableViewController: UITableViewController { |
113 | 113 | let vc = UIStoryboard(name: "HomePage", bundle: nil).instantiateViewController(withIdentifier: "RankingTableViewController") as! RankingTableViewController |
114 | 114 | vc.openIndexAry=[0,4] |
115 | 115 | self.navigationController?.pushViewController(vc, animated: true) |
116 | + }else if indexPath.row==1{ | |
117 | + //热门微课 | |
118 | + self.tabBarController?.selectedIndex=2 | |
119 | + }else if indexPath.row==2{ | |
120 | + //资源 | |
121 | + self.tabBarController?.selectedIndex=1 | |
122 | + }else{ | |
123 | + //校园电视台 | |
124 | + self.tabBarController?.selectedIndex=3 | |
116 | 125 | } |
117 | 126 | } |
118 | 127 | |
... | ... | @@ -209,8 +218,11 @@ class HomeSecondTableViewCell: UITableViewCell,UICollectionViewDelegate,UICollec |
209 | 218 | } |
210 | 219 | } |
211 | 220 | func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { |
212 | - //点击进入学校 appRootViewController() | |
213 | - NSLog("点击了****\(dataSet[indexPath.row])") | |
221 | + let url = URL(string:dataSet[indexPath.row].f_ResourceUrl) | |
222 | + let player = AVPlayerViewController() | |
223 | + player.player = AVPlayer(url: url!) | |
224 | + player.videoGravity = AVLayerVideoGravityResizeAspect | |
225 | + appRootViewController().present(player, animated: true, completion: nil) | |
214 | 226 | } |
215 | 227 | func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { |
216 | 228 | return CGSize(width: (getScreenWidth()-45)/2, height: ((getScreenWidth()-45)/2/33*16+67)) | ... | ... |
YouerLiveVideo/YouerLiveVideo/controllers/MicroCourse/MicroCourseViewController.swift
... | ... | @@ -9,7 +9,7 @@ |
9 | 9 | import UIKit |
10 | 10 | import AVKit |
11 | 11 | |
12 | -class MicroCourseViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchControllerDelegate,UISearchResultsUpdating { | |
12 | +class MicroCourseViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchControllerDelegate,UISearchResultsUpdating,UISearchBarDelegate{ | |
13 | 13 | @IBOutlet var tableView: UITableView! |
14 | 14 | |
15 | 15 | @IBOutlet var grayView: UIView! |
... | ... | @@ -18,9 +18,10 @@ class MicroCourseViewController: UIViewController,UITableViewDelegate,UITableVie |
18 | 18 | |
19 | 19 | var searchController:UISearchController! |
20 | 20 | var dataSetAry:[String]=["葛建军","张道峰","徐晓杰","左承","段合江"] |
21 | - var searchAry:[String]=[] | |
21 | + var searchAry:[MicroCourseModel]=[] | |
22 | 22 | var currentPage:Int=1 //当前页数,每次取十个数据 |
23 | 23 | var resourceData:[MicroCourseModel]=[] |
24 | + var parameter:Dictionary<String,AnyObject>? | |
24 | 25 | override func viewDidLoad() { |
25 | 26 | super.viewDidLoad() |
26 | 27 | self.configTheme() |
... | ... | @@ -31,11 +32,27 @@ class MicroCourseViewController: UIViewController,UITableViewDelegate,UITableVie |
31 | 32 | self.tableView.reloadData() |
32 | 33 | } |
33 | 34 | }) |
35 | + NotificationCenter.default.addObserver(self, selector: #selector(ResourceViewController.reloadTableView), name: NSNotification.Name(rawValue: "FilterReloadTableView"), object: nil) | |
36 | + } | |
37 | + //筛选结束后刷新界面 | |
38 | + func reloadTableView(noti:Notification){ | |
39 | + let parameters=(noti.object as! Dictionary<String,AnyObject>) | |
40 | + if parameters["type"]?.int8Value==0{ | |
41 | + parameter=parameters | |
42 | + currentPage=1 | |
43 | + resourceData.removeAll() | |
44 | + refreshLivesAction(parameters: parameters, completionHandler: { (success) in | |
45 | + if success{ | |
46 | + self.tableView.reloadData() | |
47 | + } | |
48 | + }) | |
49 | + } | |
34 | 50 | } |
35 | 51 | func addSearchController(){ |
36 | 52 | self.definesPresentationContext=true |
37 | 53 | searchController=UISearchController(searchResultsController: nil) |
38 | 54 | searchController.delegate=self |
55 | + searchController.searchBar.delegate=self | |
39 | 56 | searchController.searchResultsUpdater=self |
40 | 57 | searchController.searchBar.barTintColor=UIColor.groupTableViewBackground |
41 | 58 | searchController.searchBar.placeholder="搜索" |
... | ... | @@ -56,7 +73,11 @@ class MicroCourseViewController: UIViewController,UITableViewDelegate,UITableVie |
56 | 73 | //下拉刷新 |
57 | 74 | self.currentPage=1 |
58 | 75 | self.resourceData.removeAll() |
59 | - self.refreshLivesAction(parameters: ["type":0 as AnyObject,"orderby":1 as AnyObject,"pageIndex":self.currentPage as AnyObject,"pageSize":10 as AnyObject], completionHandler: { (success) in | |
76 | + var p:Dictionary<String,AnyObject>=["type":0 as AnyObject,"orderby":1 as AnyObject,"pageIndex":self.currentPage as AnyObject,"pageSize":10 as AnyObject] | |
77 | + if self.parameter != nil { | |
78 | + p=self.parameter! | |
79 | + } | |
80 | + self.refreshLivesAction(parameters: p, completionHandler: { (success) in | |
60 | 81 | if success{ |
61 | 82 | self.tableView.reloadData() |
62 | 83 | } |
... | ... | @@ -67,7 +88,11 @@ class MicroCourseViewController: UIViewController,UITableViewDelegate,UITableVie |
67 | 88 | tableView.mj_header=header |
68 | 89 | tableView.mj_footer=MJRefreshBackNormalFooter(refreshingBlock: { |
69 | 90 | //上拉加载更多 |
70 | - self.refreshLivesAction(parameters: ["type":0 as AnyObject,"orderby":1 as AnyObject,"pageIndex":self.currentPage as AnyObject,"pageSize":10 as AnyObject], completionHandler: { (success) in | |
91 | + var p:Dictionary<String,AnyObject>=["type":0 as AnyObject,"orderby":1 as AnyObject,"pageIndex":self.currentPage as AnyObject,"pageSize":10 as AnyObject] | |
92 | + if self.parameter != nil { | |
93 | + p=self.parameter! | |
94 | + } | |
95 | + self.refreshLivesAction(parameters: p, completionHandler: { (success) in | |
71 | 96 | if success{ |
72 | 97 | self.tableView.reloadData() |
73 | 98 | } |
... | ... | @@ -76,17 +101,23 @@ class MicroCourseViewController: UIViewController,UITableViewDelegate,UITableVie |
76 | 101 | }) |
77 | 102 | } |
78 | 103 | // MARK: - 刷新数据接口 |
79 | - func refreshLivesAction(parameters:Dictionary<String,AnyObject>,completionHandler:@escaping (Bool) -> ()){ | |
104 | + func refreshLivesAction(isSearch:Bool=false,parameters:Dictionary<String,AnyObject>,completionHandler:@escaping (Bool) -> ()){ | |
80 | 105 | AppDelegate.instance().httpServer.postResourceList(parameters: parameters) { (str, error) in |
81 | 106 | var success:Bool=true |
82 | 107 | if error==nil { |
83 | 108 | if JSON.fromString(jsonString: str)!["status"].intValue == 1{ |
84 | 109 | httpJsonResule(jsonString: str, error: error, successHandler: { (json) in |
85 | - if JSON.fromString(jsonString: str)!["data"].arrayValue.count>0{ | |
86 | - self.currentPage+=1 | |
87 | - } | |
88 | - for item in JSON.fromString(jsonString: str)!["data"].arrayValue { | |
89 | - self.resourceData.append(MicroCourseModel(j: item)) | |
110 | + if isSearch { | |
111 | + for item in JSON.fromString(jsonString: str)!["data"].arrayValue { | |
112 | + self.searchAry.append(MicroCourseModel(j: item)) | |
113 | + } | |
114 | + }else{ | |
115 | + if JSON.fromString(jsonString: str)!["data"].arrayValue.count>0{ | |
116 | + self.currentPage+=1 | |
117 | + } | |
118 | + for item in JSON.fromString(jsonString: str)!["data"].arrayValue { | |
119 | + self.resourceData.append(MicroCourseModel(j: item)) | |
120 | + } | |
90 | 121 | } |
91 | 122 | success=true |
92 | 123 | }, failHandler: { (error) in |
... | ... | @@ -104,6 +135,12 @@ class MicroCourseViewController: UIViewController,UITableViewDelegate,UITableVie |
104 | 135 | completionHandler(success) |
105 | 136 | } |
106 | 137 | } |
138 | + // MARK: - 跳转到筛选 | |
139 | + @IBAction func jumpFilterVCAction(_ sender: UIButton) { | |
140 | + let vc = UIStoryboard(name: "Resource", bundle: nil).instantiateViewController(withIdentifier: "FilterViewController") as! FilterViewController | |
141 | + vc.type=FilterParameter(type: 0) | |
142 | + self.present(vc.wrapWithNavigationController(), animated: true, completion: nil) | |
143 | + } | |
107 | 144 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { |
108 | 145 | if tableView==searchTableView{ |
109 | 146 | return searchAry.count |
... | ... | @@ -114,7 +151,7 @@ class MicroCourseViewController: UIViewController,UITableViewDelegate,UITableVie |
114 | 151 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { |
115 | 152 | if tableView==searchTableView { |
116 | 153 | let cell=tableView.dequeueReusableCell(withIdentifier: "cell") |
117 | - cell?.textLabel?.text=searchAry[indexPath.row] | |
154 | + cell?.textLabel?.text=searchAry[indexPath.row].f_Title | |
118 | 155 | return cell! |
119 | 156 | }else{ |
120 | 157 | let cell=tableView.dequeueReusableCell(withIdentifier: "identifier") as! MicroCourseViewControllerTableViewCell |
... | ... | @@ -125,12 +162,12 @@ class MicroCourseViewController: UIViewController,UITableViewDelegate,UITableVie |
125 | 162 | } |
126 | 163 | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { |
127 | 164 | if tableView==searchTableView { |
128 | - let vc = UIStoryboard(name: "HomePage", bundle: nil).instantiateViewController(withIdentifier: "RankingTableViewController") as! RankingTableViewController | |
129 | - self.navigationController?.pushViewController(vc, animated: true) | |
165 | + let url = URL(string:searchAry[indexPath.row].f_ResourceUrl) | |
166 | + let player = AVPlayerViewController() | |
167 | + player.player = AVPlayer(url: url!) | |
168 | + player.videoGravity = AVLayerVideoGravityResizeAspect | |
169 | + self.present(player, animated: true, completion: nil) | |
130 | 170 | }else{ |
131 | -// let vc = UIStoryboard(name: "Resource", bundle: nil).instantiateViewController(withIdentifier: "LiveInforViewControllerVC") as! LiveInforViewController | |
132 | - | |
133 | -// self.navigationController?.pushViewController(vc, animated: true) | |
134 | 171 | let url = URL(string:resourceData[indexPath.row].f_ResourceUrl) |
135 | 172 | let player = AVPlayerViewController() |
136 | 173 | player.player = AVPlayer(url: url!) |
... | ... | @@ -140,6 +177,9 @@ class MicroCourseViewController: UIViewController,UITableViewDelegate,UITableVie |
140 | 177 | } |
141 | 178 | //取消键盘输入状态 |
142 | 179 | @IBAction func cancleSearchActivit(_ sender: UITapGestureRecognizer) { |
180 | + self.searchAry.removeAll() | |
181 | + searchTableHeight.constant=44 | |
182 | + self.searchTableView.reloadData() | |
143 | 183 | searchController.isActive=false |
144 | 184 | } |
145 | 185 | func willPresentSearchController(_ searchController: UISearchController) { |
... | ... | @@ -149,17 +189,37 @@ class MicroCourseViewController: UIViewController,UITableViewDelegate,UITableVie |
149 | 189 | searchTableHeight.constant=44 |
150 | 190 | grayView.isHidden=true |
151 | 191 | } |
192 | + //searchaBarDelegate | |
193 | + func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { | |
194 | + refreshLivesAction(isSearch: true,parameters: ["type":0 as AnyObject,"orderby":1 as AnyObject,"pageIndex":1 as AnyObject,"keyword":searchBar.text as AnyObject,"pageSize":10 as AnyObject], completionHandler: { (success) in | |
195 | + if success{ | |
196 | + if CGFloat((self.searchAry.count+1)*44)>(getScreenHeight()-64){ | |
197 | + self.searchTableHeight.constant=getScreenHeight()-64 | |
198 | + }else{ | |
199 | + self.searchTableHeight.constant=CGFloat((self.searchAry.count+1)*44) | |
200 | + } | |
201 | + self.searchTableView.reloadData() | |
202 | + } | |
203 | + }) | |
204 | + } | |
205 | + func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { | |
206 | + self.searchAry.removeAll() | |
207 | + searchTableHeight.constant=44 | |
208 | + self.searchTableView.reloadData() | |
209 | + searchController.isActive=false | |
210 | + } | |
211 | + | |
152 | 212 | //谓词搜索过滤 |
153 | 213 | func updateSearchResults(for searchController: UISearchController) { |
154 | - let searchString=searchController.searchBar.text | |
155 | - let predicate=NSPredicate(format: "SELF CONTAINS[c] %@", searchString!) | |
156 | - searchAry=(dataSetAry as NSArray).filtered(using: predicate) as! [String] | |
157 | - if CGFloat((searchAry.count+1)*44)>(getScreenHeight()-64){ | |
158 | - searchTableHeight.constant=getScreenHeight()-64 | |
159 | - }else{ | |
160 | - searchTableHeight.constant=CGFloat((searchAry.count+1)*44) | |
161 | - } | |
162 | - searchTableView.reloadData() | |
214 | +// let searchString=searchController.searchBar.text | |
215 | +// let predicate=NSPredicate(format: "SELF CONTAINS[c] %@", searchString!) | |
216 | +// searchAry=(dataSetAry as NSArray).filtered(using: predicate) as! [String] | |
217 | +// if CGFloat((searchAry.count+1)*44)>(getScreenHeight()-64){ | |
218 | +// searchTableHeight.constant=getScreenHeight()-64 | |
219 | +// }else{ | |
220 | +// searchTableHeight.constant=CGFloat((searchAry.count+1)*44) | |
221 | +// } | |
222 | +// searchTableView.reloadData() | |
163 | 223 | } |
164 | 224 | |
165 | 225 | } | ... | ... |
YouerLiveVideo/YouerLiveVideo/controllers/Resource/FilterListViewController.swift
0 → 100644
... | ... | @@ -0,0 +1,205 @@ |
1 | +// | |
2 | +// FilterListViewController.swift | |
3 | +// YouerLiveVideo | |
4 | +// | |
5 | +// Created by 葛建军 on 17/5/24. | |
6 | +// Copyright © 2017年 左丞. All rights reserved. | |
7 | +// | |
8 | + | |
9 | +import UIKit | |
10 | + | |
11 | +class FilterListViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { | |
12 | + var index:Int=0 | |
13 | + var superVC:FilterViewController! | |
14 | + var dataSet:[filterListModel]=[] | |
15 | + var currentItem:filterListModel? //记录当前页面是否可以返回 | |
16 | + var selectItem:filterListModel? //记录选中的目录 | |
17 | + @IBOutlet var tableView: UITableView! | |
18 | + override func viewDidLoad() { | |
19 | + super.viewDidLoad() | |
20 | + getContentWithIndex() | |
21 | + } | |
22 | + func getContentWithIndex(){ | |
23 | + switch index { | |
24 | + case 0: | |
25 | + AppDelegate.instance().httpServer.getWaveCatagory(parameters: ["waveId":superVC.type.materials as AnyObject]) { (str, error) in | |
26 | + if error==nil { | |
27 | + if JSON.fromString(jsonString: str)!["status"].intValue == 1{ | |
28 | + httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | |
29 | + for item in JSON.fromString(jsonString: str)!["data"].arrayValue { | |
30 | + self.dataSet.append(filterListModel(j: item)) | |
31 | + } | |
32 | + self.currentItem=filterListModel(array: self.dataSet) | |
33 | + self.tableView.reloadData() | |
34 | + }, failHandler: { (error) in | |
35 | + self.view.makeToast("获取教材目录失败:\(error.localizedDescription)") | |
36 | + }) | |
37 | + }else{ | |
38 | + self.view.makeToast("获取教材目录失败:\(JSON.fromString(jsonString: str)!["message"].stringValue)") | |
39 | + } | |
40 | + }else{ | |
41 | + self.view.makeToast("获取教材目录失败:\(error!.description)") | |
42 | + } | |
43 | + } | |
44 | + case 1: | |
45 | + AppDelegate.instance().httpServer.getTopicCatagory(parameters: ["waveId":superVC.type.materials as AnyObject]) { (str, error) in | |
46 | + if error==nil { | |
47 | + if JSON.fromString(jsonString: str)!["status"].intValue == 1{ | |
48 | + httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | |
49 | + for item in JSON.fromString(jsonString: str)!["data"].arrayValue { | |
50 | + self.dataSet.append(filterListModel(j: item)) | |
51 | + } | |
52 | + }, failHandler: { (error) in | |
53 | + self.view.makeToast("获取知识点目录失败:\(error.localizedDescription)") | |
54 | + }) | |
55 | + }else{ | |
56 | + self.view.makeToast("获取知识点目录失败:\(JSON.fromString(jsonString: str)!["message"].stringValue)") | |
57 | + } | |
58 | + }else{ | |
59 | + self.view.makeToast("获取知识点目录失败:\(error!.description)") | |
60 | + } | |
61 | + } | |
62 | + case 2: | |
63 | + AppDelegate.instance().httpServer.getTestCatagory(parameters: ["waveId":superVC.type.materials as AnyObject]) { (str, error) in | |
64 | + if error==nil { | |
65 | + if JSON.fromString(jsonString: str)!["status"].intValue == 1{ | |
66 | + httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | |
67 | + for item in JSON.fromString(jsonString: str)!["data"].arrayValue { | |
68 | + self.dataSet.append(filterListModel(j: item)) | |
69 | + } | |
70 | + }, failHandler: { (error) in | |
71 | + self.view.makeToast("获取考点目录失败:\(error.localizedDescription)") | |
72 | + }) | |
73 | + }else{ | |
74 | + self.view.makeToast("获取考点目录失败:\(JSON.fromString(jsonString: str)!["message"].stringValue)") | |
75 | + } | |
76 | + }else{ | |
77 | + self.view.makeToast("获取考点目录失败:\(error!.description)") | |
78 | + } | |
79 | + } | |
80 | + default: | |
81 | + break | |
82 | + } | |
83 | + | |
84 | + } | |
85 | + //MARK: - 返回和确定按钮 | |
86 | + @IBAction func backAction(_ sender: UIBarButtonItem) { | |
87 | + if currentItem != nil { | |
88 | + if currentItem?.parentModel != nil { | |
89 | + //返回到上级界面 | |
90 | + self.dataSet=currentItem!.parentModel!.children | |
91 | + self.tableView.reloadData() | |
92 | + currentItem=currentItem!.parentModel | |
93 | + if selectItem != nil { | |
94 | + selectItem=nil | |
95 | + } | |
96 | + }else{ | |
97 | + self.navigationController!.popViewController(animated: true) | |
98 | + } | |
99 | + } | |
100 | + } | |
101 | + @IBAction func onDoneAction(_ sender: UIBarButtonItem) { | |
102 | + if selectItem==nil { | |
103 | + self.view.makeToast("请选择目录") | |
104 | + }else{ | |
105 | + //发送通知 | |
106 | + var nameID:String="" | |
107 | + switch index { | |
108 | + case 0: | |
109 | + nameID="chapterId" | |
110 | + case 1: | |
111 | + nameID="topicId" | |
112 | + case 2: | |
113 | + nameID="testId" | |
114 | + default: | |
115 | + nameID="chapterId" | |
116 | + } | |
117 | + NotificationCenter.default.post(name: NSNotification.Name(rawValue: "FilterReloadTableView"), object: ["type":superVC.type.type as AnyObject, | |
118 | + "subjectId":superVC.type.subject as AnyObject, | |
119 | + "schooltypeId":superVC.type.schoolSection as AnyObject, | |
120 | + "gradeId":superVC.type.grade as AnyObject, | |
121 | + "courseWaveId":superVC.type.materials as AnyObject, | |
122 | + nameID:selectItem!.id as AnyObject, | |
123 | + "orderby":1 as AnyObject, | |
124 | + "pageIndex":1 as AnyObject, | |
125 | + "pageSize":10 as AnyObject]) | |
126 | + self.navigationController?.dismiss(animated: true, completion: nil) | |
127 | + } | |
128 | + } | |
129 | + | |
130 | + //MARK: - UITableViewDelegate,UITableViewDataSource | |
131 | + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { | |
132 | + return dataSet.count | |
133 | + } | |
134 | + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { | |
135 | + let cell=tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! FilterListViewCell | |
136 | + let item=dataSet[indexPath.row] | |
137 | + cell.item=item | |
138 | + cell.superVC=self | |
139 | + cell.nameLabel.text=item.name | |
140 | + if selectItem != nil { | |
141 | + if item==selectItem { | |
142 | + cell.selectBtn.setImage(UIImage(named: "resource_select"), for: UIControlState.normal) | |
143 | + }else{ | |
144 | + cell.selectBtn.setImage(UIImage(named: "resource_diselect"), for: UIControlState.normal) | |
145 | + } | |
146 | + }else{ | |
147 | + cell.selectBtn.setImage(UIImage(named: "resource_diselect"), for: UIControlState.normal) | |
148 | + } | |
149 | + return cell | |
150 | + } | |
151 | + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { | |
152 | + let item=dataSet[indexPath.row] | |
153 | + if item.children.count>0{ | |
154 | + self.currentItem=item | |
155 | + self.dataSet=item.children | |
156 | + self.tableView.reloadData() | |
157 | + } | |
158 | + } | |
159 | + override func didReceiveMemoryWarning() { | |
160 | + super.didReceiveMemoryWarning() | |
161 | + } | |
162 | +} | |
163 | +class filterListModel:NSObject{ | |
164 | + var parentModel:filterListModel? | |
165 | + var id:String="" | |
166 | + var name:String="" | |
167 | + var text:String="" | |
168 | + var open:Bool=true | |
169 | + var children:[filterListModel]=[] | |
170 | + init(j:JSON) { | |
171 | + super.init() | |
172 | + id=j["id"].stringValue | |
173 | + name=j["name"].stringValue | |
174 | + text=j["text"].stringValue | |
175 | + open=j["open"].boolValue | |
176 | + for item in j["children"].arrayValue { | |
177 | + let model=filterListModel(j: item) | |
178 | + model.parentModel=self | |
179 | + children.append(model) | |
180 | + } | |
181 | + } | |
182 | + init(array:[filterListModel]) { | |
183 | + super.init() | |
184 | + for item in array { | |
185 | + item.parentModel=self | |
186 | + children.append(item) | |
187 | + } | |
188 | + } | |
189 | +} | |
190 | +class FilterListViewCell: UITableViewCell { | |
191 | + @IBOutlet var nameLabel: UILabel! | |
192 | + @IBOutlet var selectBtn: UIButton! | |
193 | + var superVC:FilterListViewController! | |
194 | + var item:filterListModel! | |
195 | + @IBAction func changeSelectAction(_ sender: UIButton) { | |
196 | + if superVC.selectItem==item { | |
197 | + superVC.selectItem=nil | |
198 | + }else{ | |
199 | + superVC.selectItem=item | |
200 | + } | |
201 | + superVC.tableView.reloadData() | |
202 | + } | |
203 | + | |
204 | + | |
205 | +} | ... | ... |
YouerLiveVideo/YouerLiveVideo/controllers/Resource/FilterViewController.swift
... | ... | @@ -14,14 +14,12 @@ class FilterViewController: UIViewController,FilterViewDelegate { |
14 | 14 | var dataGrade:[Grade]=[] |
15 | 15 | var dataSubject:[Subject]=[] |
16 | 16 | var dataMaterials:[Material]=[] |
17 | - var type=FilterParameter() | |
17 | + var type:FilterParameter! | |
18 | 18 | override func viewDidLoad() { |
19 | 19 | super.viewDidLoad() |
20 | 20 | self.configTheme() |
21 | 21 | self.navigationItem.title="筛选" |
22 | 22 | getSchoolSection() |
23 | -// NotificationCenter.default.addObserver(self, selector: #selector(RegisterVC.keyboardWIllChange), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil) | |
24 | -// NotificationCenter.default.post(name: NSNotification.Name(rawValue: "loginOutSuccess"), object: nil) | |
25 | 23 | } |
26 | 24 | |
27 | 25 | @IBAction func dismissAction(_ sender: UIBarButtonItem) { |
... | ... | @@ -117,6 +115,11 @@ class FilterViewController: UIViewController,FilterViewDelegate { |
117 | 115 | self.getGradeWithSchoolSectionID(id: self.dataSchoolSection[0].f_Id, index: 2) |
118 | 116 | } |
119 | 117 | self.getSubjects(index: 3) |
118 | + let filterFootView=Bundle.main.loadNibNamed("FilterFootView", owner: nil, options: nil)![0] as! FilterFootView | |
119 | + self.scrollContentView.addArrangedSubview(filterFootView) | |
120 | + filterFootView.superVC=self | |
121 | + filterFootView.translatesAutoresizingMaskIntoConstraints=false | |
122 | + filterFootView.addConstraint(NSLayoutConstraint(item: filterFootView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1.0, constant: 50)) | |
120 | 123 | } |
121 | 124 | } |
122 | 125 | func selectCurrentCount(index: Int,tag:Int) { |
... | ... | @@ -234,18 +237,15 @@ class FilterViewController: UIViewController,FilterViewDelegate { |
234 | 237 | override func didReceiveMemoryWarning() { |
235 | 238 | super.didReceiveMemoryWarning() |
236 | 239 | } |
237 | - // MARK: - 销毁通知 | |
238 | - deinit { | |
239 | - NotificationCenter.default.removeObserver(self) | |
240 | - } | |
241 | 240 | } |
242 | 241 | class FilterParameter:NSObject { |
243 | 242 | var schoolSection:String? //学段 |
244 | 243 | var grade:String? //年级 |
245 | 244 | var subject:String? //学科 |
246 | 245 | var materials:String? //教材 |
247 | - override init() { | |
248 | - | |
246 | + var type:Int=0 //0-微课,1-课件(资源),2-电视台 , | |
247 | + init(type:Int) { | |
248 | + self.type=type | |
249 | 249 | } |
250 | 250 | } |
251 | 251 | class filterModel:NSObject{ | ... | ... |
YouerLiveVideo/YouerLiveVideo/controllers/Resource/Resource.storyboard
... | ... | @@ -6,6 +6,7 @@ |
6 | 6 | <dependencies> |
7 | 7 | <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11757"/> |
8 | 8 | <capability name="Aspect ratio constraints" minToolsVersion="5.1"/> |
9 | + <capability name="Constraints to layout margins" minToolsVersion="6.0"/> | |
9 | 10 | <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> |
10 | 11 | </dependencies> |
11 | 12 | <scenes> |
... | ... | @@ -77,7 +78,105 @@ |
77 | 78 | </viewController> |
78 | 79 | <placeholder placeholderIdentifier="IBFirstResponder" id="ocM-s7-Wga" userLabel="First Responder" sceneMemberID="firstResponder"/> |
79 | 80 | </objects> |
80 | - <point key="canvasLocation" x="-738.39999999999998" y="265.81709145427288"/> | |
81 | + <point key="canvasLocation" x="-1231" y="266"/> | |
82 | + </scene> | |
83 | + <!--Title--> | |
84 | + <scene sceneID="KE0-Ec-6BR"> | |
85 | + <objects> | |
86 | + <viewController storyboardIdentifier="FilterListViewController" automaticallyAdjustsScrollViewInsets="NO" id="zHt-CL-DCL" customClass="FilterListViewController" customModule="YouerLiveVideo" customModuleProvider="target" sceneMemberID="viewController"> | |
87 | + <layoutGuides> | |
88 | + <viewControllerLayoutGuide type="top" id="LdG-FX-62I"/> | |
89 | + <viewControllerLayoutGuide type="bottom" id="VWt-bS-YTo"/> | |
90 | + </layoutGuides> | |
91 | + <view key="view" contentMode="scaleToFill" id="zL1-KT-WjN"> | |
92 | + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> | |
93 | + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | |
94 | + <subviews> | |
95 | + <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="0mu-k5-awJ"> | |
96 | + <rect key="frame" x="0.0" y="64" width="375" height="603"/> | |
97 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | |
98 | + <view key="tableFooterView" contentMode="scaleToFill" id="Abq-Z2-9eV"> | |
99 | + <rect key="frame" x="0.0" y="72" width="375" height="1"/> | |
100 | + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | |
101 | + <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/> | |
102 | + </view> | |
103 | + <prototypes> | |
104 | + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="cell" id="UVN-8r-w7w" customClass="FilterListViewCell" customModule="YouerLiveVideo" customModuleProvider="target"> | |
105 | + <rect key="frame" x="0.0" y="28" width="375" height="44"/> | |
106 | + <autoresizingMask key="autoresizingMask"/> | |
107 | + <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="UVN-8r-w7w" id="9FT-AK-CvV"> | |
108 | + <rect key="frame" x="0.0" y="0.0" width="375" height="43"/> | |
109 | + <autoresizingMask key="autoresizingMask"/> | |
110 | + <subviews> | |
111 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="liq-eO-Kb6"> | |
112 | + <rect key="frame" x="8" y="12.5" width="331" height="18"/> | |
113 | + <constraints> | |
114 | + <constraint firstAttribute="width" constant="331" id="pSj-w8-k8O"/> | |
115 | + </constraints> | |
116 | + <fontDescription key="fontDescription" type="system" pointSize="15"/> | |
117 | + <nil key="textColor"/> | |
118 | + <nil key="highlightedColor"/> | |
119 | + </label> | |
120 | + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Dl9-Wp-RkY"> | |
121 | + <rect key="frame" x="347" y="12" width="20" height="20"/> | |
122 | + <constraints> | |
123 | + <constraint firstAttribute="width" constant="20" id="o5u-gy-UtC"/> | |
124 | + <constraint firstAttribute="height" constant="20" id="wd6-fW-NOJ"/> | |
125 | + </constraints> | |
126 | + <state key="normal" image="resource_diselect"/> | |
127 | + <connections> | |
128 | + <action selector="changeSelectAction:" destination="UVN-8r-w7w" eventType="touchUpInside" id="A7s-9g-mY3"/> | |
129 | + </connections> | |
130 | + </button> | |
131 | + </subviews> | |
132 | + <constraints> | |
133 | + <constraint firstAttribute="leadingMargin" secondItem="liq-eO-Kb6" secondAttribute="leading" id="L2j-lu-pe4"/> | |
134 | + <constraint firstItem="liq-eO-Kb6" firstAttribute="centerY" secondItem="9FT-AK-CvV" secondAttribute="centerY" id="Uo5-5W-S6e"/> | |
135 | + <constraint firstItem="Dl9-Wp-RkY" firstAttribute="centerY" secondItem="9FT-AK-CvV" secondAttribute="centerY" id="lwC-V7-fgU"/> | |
136 | + <constraint firstItem="Dl9-Wp-RkY" firstAttribute="leading" secondItem="liq-eO-Kb6" secondAttribute="trailing" constant="8" id="pMu-Vd-32m"/> | |
137 | + <constraint firstAttribute="trailingMargin" secondItem="Dl9-Wp-RkY" secondAttribute="trailing" id="vaR-5v-dX9"/> | |
138 | + </constraints> | |
139 | + </tableViewCellContentView> | |
140 | + <connections> | |
141 | + <outlet property="nameLabel" destination="liq-eO-Kb6" id="tdf-ix-PPl"/> | |
142 | + <outlet property="selectBtn" destination="Dl9-Wp-RkY" id="nmx-nz-3yj"/> | |
143 | + </connections> | |
144 | + </tableViewCell> | |
145 | + </prototypes> | |
146 | + <connections> | |
147 | + <outlet property="dataSource" destination="zHt-CL-DCL" id="kiJ-ze-WHW"/> | |
148 | + <outlet property="delegate" destination="zHt-CL-DCL" id="QJr-Fr-9WG"/> | |
149 | + </connections> | |
150 | + </tableView> | |
151 | + </subviews> | |
152 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | |
153 | + <constraints> | |
154 | + <constraint firstAttribute="trailing" secondItem="0mu-k5-awJ" secondAttribute="trailing" id="3Sp-No-f5O"/> | |
155 | + <constraint firstItem="0mu-k5-awJ" firstAttribute="top" secondItem="LdG-FX-62I" secondAttribute="bottom" id="CY4-QV-B2L"/> | |
156 | + <constraint firstItem="VWt-bS-YTo" firstAttribute="top" secondItem="0mu-k5-awJ" secondAttribute="bottom" id="GUd-E0-zu2"/> | |
157 | + <constraint firstItem="0mu-k5-awJ" firstAttribute="leading" secondItem="zL1-KT-WjN" secondAttribute="leading" id="P69-w1-xvo"/> | |
158 | + </constraints> | |
159 | + </view> | |
160 | + <navigationItem key="navigationItem" title="Title" id="Xi4-Cc-4Ao"> | |
161 | + <barButtonItem key="leftBarButtonItem" image="icon_back" id="TNR-MX-Haz"> | |
162 | + <connections> | |
163 | + <action selector="backAction:" destination="zHt-CL-DCL" id="CeC-PY-JdX"/> | |
164 | + </connections> | |
165 | + </barButtonItem> | |
166 | + <barButtonItem key="rightBarButtonItem" title="确定" id="H1P-q9-ZPp"> | |
167 | + <connections> | |
168 | + <action selector="onDoneAction:" destination="zHt-CL-DCL" id="NnE-RV-tBW"/> | |
169 | + </connections> | |
170 | + </barButtonItem> | |
171 | + </navigationItem> | |
172 | + <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/> | |
173 | + <connections> | |
174 | + <outlet property="tableView" destination="0mu-k5-awJ" id="nrq-Fk-c3q"/> | |
175 | + </connections> | |
176 | + </viewController> | |
177 | + <placeholder placeholderIdentifier="IBFirstResponder" id="jgm-JW-7AL" userLabel="First Responder" sceneMemberID="firstResponder"/> | |
178 | + </objects> | |
179 | + <point key="canvasLocation" x="-600.79999999999995" y="265.81709145427288"/> | |
81 | 180 | </scene> |
82 | 181 | <!--Live Infor View Controller--> |
83 | 182 | <scene sceneID="QrF-a4-VNS"> |
... | ... | @@ -372,6 +471,8 @@ |
372 | 471 | <resources> |
373 | 472 | <image name="closeAlive" width="33" height="33"/> |
374 | 473 | <image name="defphoto.png" width="256" height="256"/> |
474 | + <image name="icon_back" width="12" height="21"/> | |
475 | + <image name="resource_diselect" width="24" height="24"/> | |
375 | 476 | <image name="screen_full" width="33" height="33"/> |
376 | 477 | <image name="starLive" width="22" height="22"/> |
377 | 478 | </resources> | ... | ... |
YouerLiveVideo/YouerLiveVideo/controllers/Resource/ResourceViewController.swift
... | ... | @@ -8,7 +8,7 @@ |
8 | 8 | |
9 | 9 | import UIKit |
10 | 10 | |
11 | -class ResourceViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchControllerDelegate,UISearchResultsUpdating { | |
11 | +class ResourceViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchControllerDelegate,UISearchResultsUpdating,UISearchBarDelegate { | |
12 | 12 | @IBOutlet var tableView: UITableView! |
13 | 13 | |
14 | 14 | @IBOutlet var grayView: UIView! |
... | ... | @@ -17,9 +17,10 @@ class ResourceViewController: UIViewController,UITableViewDelegate,UITableViewDa |
17 | 17 | |
18 | 18 | var searchController:UISearchController! |
19 | 19 | var dataSetAry:[String]=["葛建军","张道峰","徐晓杰","左承","段合江"] |
20 | - var searchAry:[String]=[] | |
20 | + var searchAry:[MicroCourseModel]=[] | |
21 | 21 | var currentPage:Int=1 //当前页数,每次取十个数据 |
22 | 22 | var resourceData:[MicroCourseModel]=[] |
23 | + var parameter:Dictionary<String,AnyObject>? | |
23 | 24 | override func viewDidLoad() { |
24 | 25 | super.viewDidLoad() |
25 | 26 | self.configTheme() |
... | ... | @@ -30,11 +31,28 @@ class ResourceViewController: UIViewController,UITableViewDelegate,UITableViewDa |
30 | 31 | self.tableView.reloadData() |
31 | 32 | } |
32 | 33 | }) |
34 | + NotificationCenter.default.addObserver(self, selector: #selector(ResourceViewController.reloadTableView), name: NSNotification.Name(rawValue: "FilterReloadTableView"), object: nil) | |
35 | + | |
36 | + } | |
37 | + //筛选结束后刷新界面 | |
38 | + func reloadTableView(noti:Notification){ | |
39 | + let parameters=(noti.object as! Dictionary<String,AnyObject>) | |
40 | + if parameters["type"]?.int8Value==1{ | |
41 | + parameter=parameters | |
42 | + currentPage=1 | |
43 | + resourceData.removeAll() | |
44 | + refreshLivesAction(parameters: parameters, completionHandler: { (success) in | |
45 | + if success{ | |
46 | + self.tableView.reloadData() | |
47 | + } | |
48 | + }) | |
49 | + } | |
33 | 50 | } |
34 | 51 | func addSearchController(){ |
35 | 52 | self.definesPresentationContext=true |
36 | 53 | searchController=UISearchController(searchResultsController: nil) |
37 | 54 | searchController.delegate=self |
55 | + searchController.searchBar.delegate=self | |
38 | 56 | searchController.searchResultsUpdater=self |
39 | 57 | searchController.searchBar.barTintColor=UIColor.groupTableViewBackground |
40 | 58 | searchController.searchBar.placeholder="搜索" |
... | ... | @@ -55,7 +73,11 @@ class ResourceViewController: UIViewController,UITableViewDelegate,UITableViewDa |
55 | 73 | //下拉刷新 |
56 | 74 | self.currentPage=1 |
57 | 75 | self.resourceData.removeAll() |
58 | - self.refreshLivesAction(parameters: ["type":1 as AnyObject,"orderby":1 as AnyObject,"pageIndex":self.currentPage as AnyObject,"pageSize":10 as AnyObject], completionHandler: { (success) in | |
76 | + var p:Dictionary<String,AnyObject>=["type":1 as AnyObject,"orderby":1 as AnyObject,"pageIndex":self.currentPage as AnyObject,"pageSize":10 as AnyObject] | |
77 | + if self.parameter != nil { | |
78 | + p=self.parameter! | |
79 | + } | |
80 | + self.refreshLivesAction(parameters: p, completionHandler: { (success) in | |
59 | 81 | if success{ |
60 | 82 | self.tableView.reloadData() |
61 | 83 | } |
... | ... | @@ -66,7 +88,11 @@ class ResourceViewController: UIViewController,UITableViewDelegate,UITableViewDa |
66 | 88 | tableView.mj_header=header |
67 | 89 | tableView.mj_footer=MJRefreshBackNormalFooter(refreshingBlock: { |
68 | 90 | //上拉加载更多 |
69 | - self.refreshLivesAction(parameters: ["type":1 as AnyObject,"orderby":1 as AnyObject,"pageIndex":self.currentPage as AnyObject,"pageSize":10 as AnyObject], completionHandler: { (success) in | |
91 | + var p:Dictionary<String,AnyObject>=["type":1 as AnyObject,"orderby":1 as AnyObject,"pageIndex":self.currentPage as AnyObject,"pageSize":10 as AnyObject] | |
92 | + if self.parameter != nil { | |
93 | + p=self.parameter! | |
94 | + } | |
95 | + self.refreshLivesAction(parameters: p, completionHandler: { (success) in | |
70 | 96 | if success{ |
71 | 97 | self.tableView.reloadData() |
72 | 98 | } |
... | ... | @@ -75,17 +101,23 @@ class ResourceViewController: UIViewController,UITableViewDelegate,UITableViewDa |
75 | 101 | }) |
76 | 102 | } |
77 | 103 | // MARK: - 刷新数据接口 |
78 | - func refreshLivesAction(parameters:Dictionary<String,AnyObject>,completionHandler:@escaping (Bool) -> ()){ | |
104 | + func refreshLivesAction(isSearch:Bool=false,parameters:Dictionary<String,AnyObject>,completionHandler:@escaping (Bool) -> ()){ | |
79 | 105 | AppDelegate.instance().httpServer.postResourceList(parameters: parameters) { (str, error) in |
80 | 106 | var success:Bool=true |
81 | 107 | if error==nil { |
82 | 108 | if JSON.fromString(jsonString: str)!["status"].intValue == 1{ |
83 | 109 | httpJsonResule(jsonString: str, error: error, successHandler: { (json) in |
84 | - if JSON.fromString(jsonString: str)!["data"].arrayValue.count>0{ | |
85 | - self.currentPage+=1 | |
86 | - } | |
87 | - for item in JSON.fromString(jsonString: str)!["data"].arrayValue { | |
88 | - self.resourceData.append(MicroCourseModel(j: item)) | |
110 | + if isSearch{ | |
111 | + for item in JSON.fromString(jsonString: str)!["data"].arrayValue { | |
112 | + self.searchAry.append(MicroCourseModel(j: item)) | |
113 | + } | |
114 | + }else{ | |
115 | + if JSON.fromString(jsonString: str)!["data"].arrayValue.count>0{ | |
116 | + self.currentPage+=1 | |
117 | + } | |
118 | + for item in JSON.fromString(jsonString: str)!["data"].arrayValue { | |
119 | + self.resourceData.append(MicroCourseModel(j: item)) | |
120 | + } | |
89 | 121 | } |
90 | 122 | success=true |
91 | 123 | }, failHandler: { (error) in |
... | ... | @@ -106,6 +138,7 @@ class ResourceViewController: UIViewController,UITableViewDelegate,UITableViewDa |
106 | 138 | // MARK: - 跳转到筛选 |
107 | 139 | @IBAction func jumpFilterVCAction(_ sender: UIButton) { |
108 | 140 | let vc = UIStoryboard(name: "Resource", bundle: nil).instantiateViewController(withIdentifier: "FilterViewController") as! FilterViewController |
141 | + vc.type=FilterParameter(type: 1) | |
109 | 142 | self.present(vc.wrapWithNavigationController(), animated: true, completion: nil) |
110 | 143 | } |
111 | 144 | |
... | ... | @@ -119,7 +152,7 @@ class ResourceViewController: UIViewController,UITableViewDelegate,UITableViewDa |
119 | 152 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { |
120 | 153 | if tableView==searchTableView { |
121 | 154 | let cell=tableView.dequeueReusableCell(withIdentifier: "cell") |
122 | - cell?.textLabel?.text=searchAry[indexPath.row] | |
155 | + cell?.textLabel?.text=searchAry[indexPath.row].f_Title | |
123 | 156 | return cell! |
124 | 157 | }else{ |
125 | 158 | let cell=tableView.dequeueReusableCell(withIdentifier: "identifier") as! ResourceViewControllerTableViewCell |
... | ... | @@ -137,6 +170,9 @@ class ResourceViewController: UIViewController,UITableViewDelegate,UITableViewDa |
137 | 170 | } |
138 | 171 | //取消键盘输入状态 |
139 | 172 | @IBAction func cancleSearchActivit(_ sender: UITapGestureRecognizer) { |
173 | + self.searchAry.removeAll() | |
174 | + searchTableHeight.constant=44 | |
175 | + self.searchTableView.reloadData() | |
140 | 176 | searchController.isActive=false |
141 | 177 | } |
142 | 178 | func willPresentSearchController(_ searchController: UISearchController) { |
... | ... | @@ -146,19 +182,41 @@ class ResourceViewController: UIViewController,UITableViewDelegate,UITableViewDa |
146 | 182 | searchTableHeight.constant=44 |
147 | 183 | grayView.isHidden=true |
148 | 184 | } |
185 | + //searchaBarDelegate | |
186 | + func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { | |
187 | + refreshLivesAction(isSearch: true,parameters: ["type":0 as AnyObject,"orderby":1 as AnyObject,"pageIndex":1 as AnyObject,"keyword":searchBar.text as AnyObject,"pageSize":10 as AnyObject], completionHandler: { (success) in | |
188 | + if success{ | |
189 | + if CGFloat((self.searchAry.count+1)*44)>(getScreenHeight()-64){ | |
190 | + self.searchTableHeight.constant=getScreenHeight()-64 | |
191 | + }else{ | |
192 | + self.searchTableHeight.constant=CGFloat((self.searchAry.count+1)*44) | |
193 | + } | |
194 | + self.searchTableView.reloadData() | |
195 | + } | |
196 | + }) | |
197 | + } | |
198 | + func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { | |
199 | + self.searchAry.removeAll() | |
200 | + searchTableHeight.constant=44 | |
201 | + self.searchTableView.reloadData() | |
202 | + searchController.isActive=false | |
203 | + } | |
149 | 204 | //谓词搜索过滤 |
150 | 205 | func updateSearchResults(for searchController: UISearchController) { |
151 | - let searchString=searchController.searchBar.text | |
152 | - let predicate=NSPredicate(format: "SELF CONTAINS[c] %@", searchString!) | |
153 | - searchAry=(dataSetAry as NSArray).filtered(using: predicate) as! [String] | |
154 | - if CGFloat((searchAry.count+1)*44)>(getScreenHeight()-64){ | |
155 | - searchTableHeight.constant=getScreenHeight()-64 | |
156 | - }else{ | |
157 | - searchTableHeight.constant=CGFloat((searchAry.count+1)*44) | |
158 | - } | |
159 | - searchTableView.reloadData() | |
206 | +// let searchString=searchController.searchBar.text | |
207 | +// let predicate=NSPredicate(format: "SELF CONTAINS[c] %@", searchString!) | |
208 | +// searchAry=(dataSetAry as NSArray).filtered(using: predicate) as! [String] | |
209 | +// if CGFloat((searchAry.count+1)*44)>(getScreenHeight()-64){ | |
210 | +// searchTableHeight.constant=getScreenHeight()-64 | |
211 | +// }else{ | |
212 | +// searchTableHeight.constant=CGFloat((searchAry.count+1)*44) | |
213 | +// } | |
214 | +// searchTableView.reloadData() | |
215 | + } | |
216 | + // MARK: - 销毁通知 | |
217 | + deinit { | |
218 | + NotificationCenter.default.removeObserver(self) | |
160 | 219 | } |
161 | - | |
162 | 220 | } |
163 | 221 | |
164 | 222 | ... | ... |
YouerLiveVideo/YouerLiveVideo/controllers/Resource/View/FilterFootView.swift
0 → 100644
... | ... | @@ -0,0 +1,25 @@ |
1 | +// | |
2 | +// FilterFootView.swift | |
3 | +// YouerLiveVideo | |
4 | +// | |
5 | +// Created by 葛建军 on 17/5/24. | |
6 | +// Copyright © 2017年 左丞. All rights reserved. | |
7 | +// | |
8 | + | |
9 | +import UIKit | |
10 | + | |
11 | +class FilterFootView: UIView { | |
12 | + var superVC:FilterViewController! | |
13 | + var array:[String]=["教材目录","知识点目录","考点目录"] | |
14 | + @IBAction func pushListAction(_ sender: UIButton) { | |
15 | + if superVC.type.schoolSection != nil && superVC.type.materials != nil && superVC.type.grade != nil && superVC.type.subject != nil{ | |
16 | + let vc=UIStoryboard(name: "Resource", bundle: nil).instantiateViewController(withIdentifier: "FilterListViewController") as! FilterListViewController | |
17 | + vc.superVC=superVC | |
18 | + vc.title=array[sender.tag] | |
19 | + vc.index=sender.tag | |
20 | + superVC.navigationController?.pushViewController(vc, animated: true) | |
21 | + }else{ | |
22 | + superVC.view.makeToast("以上筛选条件都必选") | |
23 | + } | |
24 | + } | |
25 | +} | ... | ... |
YouerLiveVideo/YouerLiveVideo/controllers/Resource/View/FilterFootView.xib
0 → 100644
... | ... | @@ -0,0 +1,65 @@ |
1 | +<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |
2 | +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="11762" systemVersion="15G1217" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES"> | |
3 | + <device id="retina4_7" orientation="portrait"> | |
4 | + <adaptation id="fullscreen"/> | |
5 | + </device> | |
6 | + <dependencies> | |
7 | + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11757"/> | |
8 | + <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/> | |
9 | + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | |
10 | + </dependencies> | |
11 | + <objects> | |
12 | + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> | |
13 | + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> | |
14 | + <view contentMode="scaleToFill" restorationIdentifier="FilterFootView" id="iN0-l3-epB" customClass="FilterFootView" customModule="YouerLiveVideo" customModuleProvider="target"> | |
15 | + <rect key="frame" x="0.0" y="0.0" width="431" height="74"/> | |
16 | + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | |
17 | + <subviews> | |
18 | + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qkY-Fg-R07"> | |
19 | + <rect key="frame" x="0.0" y="0.0" width="143.5" height="74"/> | |
20 | + <state key="normal" title="教材目录"> | |
21 | + <color key="titleColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> | |
22 | + </state> | |
23 | + <connections> | |
24 | + <action selector="pushListAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="pw6-rP-H1d"/> | |
25 | + </connections> | |
26 | + </button> | |
27 | + <button opaque="NO" tag="1" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9IP-30-ds0"> | |
28 | + <rect key="frame" x="144" y="0.0" width="143" height="74"/> | |
29 | + <state key="normal" title="知识点目录"> | |
30 | + <color key="titleColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> | |
31 | + </state> | |
32 | + <connections> | |
33 | + <action selector="pushListAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="Gge-fr-oCB"/> | |
34 | + </connections> | |
35 | + </button> | |
36 | + <button opaque="NO" tag="2" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hSs-Ue-9q5"> | |
37 | + <rect key="frame" x="287.5" y="0.0" width="143.5" height="74"/> | |
38 | + <state key="normal" title="考点目录"> | |
39 | + <color key="titleColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> | |
40 | + </state> | |
41 | + <connections> | |
42 | + <action selector="pushListAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="FMb-2J-e1r"/> | |
43 | + </connections> | |
44 | + </button> | |
45 | + </subviews> | |
46 | + <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |
47 | + <constraints> | |
48 | + <constraint firstItem="hSs-Ue-9q5" firstAttribute="width" secondItem="iN0-l3-epB" secondAttribute="width" multiplier="1:3" id="3ep-1I-NMw"/> | |
49 | + <constraint firstItem="qkY-Fg-R07" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="4MM-T2-3um"/> | |
50 | + <constraint firstAttribute="bottom" secondItem="9IP-30-ds0" secondAttribute="bottom" id="5M3-1d-KtT"/> | |
51 | + <constraint firstItem="hSs-Ue-9q5" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="7KG-n9-ZZJ"/> | |
52 | + <constraint firstItem="9IP-30-ds0" firstAttribute="leading" secondItem="qkY-Fg-R07" secondAttribute="trailing" id="C6x-TT-ZGB"/> | |
53 | + <constraint firstAttribute="bottom" secondItem="hSs-Ue-9q5" secondAttribute="bottom" id="CLg-CF-ZXB"/> | |
54 | + <constraint firstItem="qkY-Fg-R07" firstAttribute="width" secondItem="iN0-l3-epB" secondAttribute="width" multiplier="1:3" id="R0D-P1-Z0B"/> | |
55 | + <constraint firstItem="9IP-30-ds0" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="RVd-2Y-GkH"/> | |
56 | + <constraint firstAttribute="trailing" secondItem="hSs-Ue-9q5" secondAttribute="trailing" id="TWF-ru-PiJ"/> | |
57 | + <constraint firstItem="qkY-Fg-R07" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="dPN-9C-qEw"/> | |
58 | + <constraint firstAttribute="bottom" secondItem="qkY-Fg-R07" secondAttribute="bottom" id="izw-3e-8LX"/> | |
59 | + <constraint firstItem="hSs-Ue-9q5" firstAttribute="leading" secondItem="9IP-30-ds0" secondAttribute="trailing" id="pqu-rt-gFv"/> | |
60 | + </constraints> | |
61 | + <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/> | |
62 | + <point key="canvasLocation" x="-26.5" y="-714"/> | |
63 | + </view> | |
64 | + </objects> | |
65 | +</document> | ... | ... |