Manos Chorianopoulos

ProfileViewController part 1

...@@ -101,7 +101,7 @@ struct OfferModel { ...@@ -101,7 +101,7 @@ struct OfferModel {
101 discountType: "price", 101 discountType: "price",
102 bannerImage: "dominos_banner", 102 bannerImage: "dominos_banner",
103 merchantLogo: "dominos_logo", 103 merchantLogo: "dominos_logo",
104 - expirationDate: "έως 30/09", 104 + expirationDate: "έως 30-09",
105 color: 0xEE417D, 105 color: 0xEE417D,
106 isFavorite: true 106 isFavorite: true
107 ), 107 ),
...@@ -113,7 +113,7 @@ struct OfferModel { ...@@ -113,7 +113,7 @@ struct OfferModel {
113 discountType: "percentage", 113 discountType: "percentage",
114 bannerImage: "dominos_banner", 114 bannerImage: "dominos_banner",
115 merchantLogo: "dominos_logo", 115 merchantLogo: "dominos_logo",
116 - expirationDate: "έως 30/09", 116 + expirationDate: "έως 30-09",
117 color: 0xEE417D, 117 color: 0xEE417D,
118 isFavorite: false 118 isFavorite: false
119 ), 119 ),
...@@ -127,7 +127,7 @@ struct OfferModel { ...@@ -127,7 +127,7 @@ struct OfferModel {
127 // discountType: "percentage", 127 // discountType: "percentage",
128 // bannerImage: "car_rental_banner", 128 // bannerImage: "car_rental_banner",
129 // merchantLogo: "avis_logo", 129 // merchantLogo: "avis_logo",
130 - // expirationDate: "έως 30/09", 130 + // expirationDate: "έως 30-09",
131 // color: 0xEE417D, 131 // color: 0xEE417D,
132 // isFavorite: true 132 // isFavorite: true
133 // ), 133 // ),
...@@ -139,7 +139,7 @@ struct OfferModel { ...@@ -139,7 +139,7 @@ struct OfferModel {
139 // discountType: "amount", 139 // discountType: "amount",
140 // bannerImage: "hotel_banner", 140 // bannerImage: "hotel_banner",
141 // merchantLogo: "booking_logo", 141 // merchantLogo: "booking_logo",
142 - // expirationDate: "έως 30/09", 142 + // expirationDate: "έως 30-09",
143 // color: 0xEE417D, 143 // color: 0xEE417D,
144 // isFavorite: true 144 // isFavorite: true
145 // ), 145 // ),
...@@ -153,7 +153,7 @@ struct OfferModel { ...@@ -153,7 +153,7 @@ struct OfferModel {
153 discountType: "percentage", 153 discountType: "percentage",
154 bannerImage: "musa_banner", 154 bannerImage: "musa_banner",
155 merchantLogo: "musa_logo", 155 merchantLogo: "musa_logo",
156 - expirationDate: "έως 30/09", 156 + expirationDate: "έως 30-09",
157 color: 0x09914E, 157 color: 0x09914E,
158 isFavorite: false 158 isFavorite: false
159 ), 159 ),
...@@ -165,7 +165,7 @@ struct OfferModel { ...@@ -165,7 +165,7 @@ struct OfferModel {
165 discountType: "percentage", 165 discountType: "percentage",
166 bannerImage: "musa_banner", 166 bannerImage: "musa_banner",
167 merchantLogo: "musa_logo", 167 merchantLogo: "musa_logo",
168 - expirationDate: "έως 30/09", 168 + expirationDate: "έως 30-09",
169 color: 0x09914E, 169 color: 0x09914E,
170 isFavorite: true 170 isFavorite: true
171 ), 171 ),
...@@ -179,7 +179,7 @@ struct OfferModel { ...@@ -179,7 +179,7 @@ struct OfferModel {
179 discountType: "percentage", 179 discountType: "percentage",
180 bannerImage: "ranch_banner", 180 bannerImage: "ranch_banner",
181 merchantLogo: "ranch_logo", 181 merchantLogo: "ranch_logo",
182 - expirationDate: "έως 30/09", 182 + expirationDate: "έως 30-09",
183 color: 0xFC9F25, 183 color: 0xFC9F25,
184 isFavorite: false 184 isFavorite: false
185 ), 185 ),
...@@ -191,7 +191,7 @@ struct OfferModel { ...@@ -191,7 +191,7 @@ struct OfferModel {
191 discountType: "buyOneGetOne", 191 discountType: "buyOneGetOne",
192 bannerImage: "ranch_banner", 192 bannerImage: "ranch_banner",
193 merchantLogo: "ranch_logo", 193 merchantLogo: "ranch_logo",
194 - expirationDate: "έως 30/09", 194 + expirationDate: "έως 30-09",
195 color: 0xFC9F25, 195 color: 0xFC9F25,
196 isFavorite: false 196 isFavorite: false
197 ), 197 ),
...@@ -205,7 +205,7 @@ struct OfferModel { ...@@ -205,7 +205,7 @@ struct OfferModel {
205 discountType: "amount", 205 discountType: "amount",
206 bannerImage: "coffeeisland_banner", 206 bannerImage: "coffeeisland_banner",
207 merchantLogo: "coffeeisland_logo", 207 merchantLogo: "coffeeisland_logo",
208 - expirationDate: "έως 30/09", 208 + expirationDate: "έως 30-09",
209 color: 0xEE417D, 209 color: 0xEE417D,
210 isFavorite: false 210 isFavorite: false
211 ), 211 ),
...@@ -217,7 +217,7 @@ struct OfferModel { ...@@ -217,7 +217,7 @@ struct OfferModel {
217 discountType: "percentage", 217 discountType: "percentage",
218 bannerImage: "coffeeisland_banner", 218 bannerImage: "coffeeisland_banner",
219 merchantLogo: "coffeeisland_logo", 219 merchantLogo: "coffeeisland_logo",
220 - expirationDate: "έως 30/09", 220 + expirationDate: "έως 30-09",
221 color: 0xEE417D, 221 color: 0xEE417D,
222 isFavorite: false 222 isFavorite: false
223 ), 223 ),
...@@ -231,7 +231,7 @@ struct OfferModel { ...@@ -231,7 +231,7 @@ struct OfferModel {
231 discountType: "percentage", 231 discountType: "percentage",
232 bannerImage: "ninemia_banner", 232 bannerImage: "ninemia_banner",
233 merchantLogo: "ninemia_logo", 233 merchantLogo: "ninemia_logo",
234 - expirationDate: "έως 30/09", 234 + expirationDate: "έως 30-09",
235 color: 0xEE417D, 235 color: 0xEE417D,
236 isFavorite: true 236 isFavorite: true
237 ), 237 ),
...@@ -243,7 +243,7 @@ struct OfferModel { ...@@ -243,7 +243,7 @@ struct OfferModel {
243 discountType: "percentage", 243 discountType: "percentage",
244 bannerImage: "ninemia_banner", 244 bannerImage: "ninemia_banner",
245 merchantLogo: "ninemia_logo", 245 merchantLogo: "ninemia_logo",
246 - expirationDate: "έως 30/09", 246 + expirationDate: "έως 30-09",
247 color: 0xEE417D, 247 color: 0xEE417D,
248 isFavorite: false 248 isFavorite: false
249 ), 249 ),
...@@ -257,7 +257,7 @@ struct OfferModel { ...@@ -257,7 +257,7 @@ struct OfferModel {
257 discountType: "percentage", 257 discountType: "percentage",
258 bannerImage: "moustakas_banner", 258 bannerImage: "moustakas_banner",
259 merchantLogo: "moustakas_logo", 259 merchantLogo: "moustakas_logo",
260 - expirationDate: "έως 30/09", 260 + expirationDate: "έως 30-09",
261 color: 0xEE417D, 261 color: 0xEE417D,
262 isFavorite: false 262 isFavorite: false
263 ), 263 ),
...@@ -269,7 +269,7 @@ struct OfferModel { ...@@ -269,7 +269,7 @@ struct OfferModel {
269 discountType: "buyOneGetOne", 269 discountType: "buyOneGetOne",
270 bannerImage: "moustakas_banner", 270 bannerImage: "moustakas_banner",
271 merchantLogo: "moustakas_logo", 271 merchantLogo: "moustakas_logo",
272 - expirationDate: "έως 30/09", 272 + expirationDate: "έως 30-09",
273 color: 0xEE417D, 273 color: 0xEE417D,
274 isFavorite: false 274 isFavorite: false
275 ), 275 ),
...@@ -283,7 +283,7 @@ struct OfferModel { ...@@ -283,7 +283,7 @@ struct OfferModel {
283 discountType: "amount", 283 discountType: "amount",
284 bannerImage: "migato_banner", 284 bannerImage: "migato_banner",
285 merchantLogo: "migato_logo", 285 merchantLogo: "migato_logo",
286 - expirationDate: "έως 30/09", 286 + expirationDate: "έως 30-09",
287 color: 0xEE417D, 287 color: 0xEE417D,
288 isFavorite: false 288 isFavorite: false
289 ), 289 ),
...@@ -295,7 +295,7 @@ struct OfferModel { ...@@ -295,7 +295,7 @@ struct OfferModel {
295 discountType: "percentage", 295 discountType: "percentage",
296 bannerImage: "migato_banner", 296 bannerImage: "migato_banner",
297 merchantLogo: "migato_logo", 297 merchantLogo: "migato_logo",
298 - expirationDate: "έως 30/09", 298 + expirationDate: "έως 30-09",
299 color: 0xEE417D, 299 color: 0xEE417D,
300 isFavorite: false 300 isFavorite: false
301 ) 301 )
......
...@@ -8,22 +8,325 @@ ...@@ -8,22 +8,325 @@
8 import UIKit 8 import UIKit
9 9
10 @objc public class ProfileViewController: UIViewController { 10 @objc public class ProfileViewController: UIViewController {
11 + @IBOutlet weak var tableView: UITableView!
12 +
13 + // MARK: - Dummy Data
14 + let allOffers: [OfferModel] = [
15 + // Προτάσεις για εσένα
16 + OfferModel(
17 + category: "Προτάσεις για εσένα",
18 + title: "15% έκπτωση",
19 + description: "σε όλα τα προϊόντα",
20 + discount: "15%",
21 + discountType: "percentage",
22 + bannerImage: "musa_banner",
23 + merchantLogo: "musa_logo",
24 + expirationDate: "έως 30-09",
25 + color: 0x09914E,
26 + isFavorite: true,
27 + active: false,
28 + redeemed: false
29 + ),
30 + OfferModel(
31 + category: "Προτάσεις για εσένα",
32 + title: "10% έκπτωση",
33 + description: "στην κατασκήνωση στο The Ranch",
34 + discount: "10%",
35 + discountType: "percentage",
36 + bannerImage: "ranch_banner",
37 + merchantLogo: "ranch_logo",
38 + expirationDate: "έως 30-09",
39 + color: 0xFC9F25,
40 + isFavorite: false,
41 + active: false,
42 + redeemed: false
43 + ),
44 + OfferModel(
45 + category: "Προτάσεις για εσένα",
46 + title: "1+1 εισιτήριο",
47 + description: "δώρο στην είσοδο του παιδότοπου",
48 + discount: "1+1",
49 + discountType: "buyOneGetOne",
50 + bannerImage: "ranch_banner",
51 + merchantLogo: "ranch_logo",
52 + expirationDate: "έως 30-09",
53 + color: 0xFC9F25,
54 + isFavorite: true,
55 + active: false,
56 + redeemed: false
57 + ),
58 + OfferModel(
59 + category: "Προτάσεις για εσένα",
60 + title: "10% έκπτωση",
61 + description: "σε όλες τις υπηρεσίες",
62 + discount: "10%",
63 + discountType: "percentage",
64 + bannerImage: "ninemia_banner",
65 + merchantLogo: "ninemia_logo",
66 + expirationDate: "έως 30-09",
67 + color: 0xEE417D,
68 + isFavorite: false,
69 + active: false,
70 + redeemed: false
71 + ),
72 + OfferModel(
73 + category: "Προτάσεις για εσένα",
74 + title: "10% έκπτωση",
75 + description: "για αγορές από τα φυσικά καταστήματα",
76 + discount: "10%",
77 + discountType: "percentage",
78 + bannerImage: "moustakas_banner",
79 + merchantLogo: "moustakas_logo",
80 + expirationDate: "έως 30-09",
81 + color: 0xEE417D,
82 + isFavorite: true,
83 + active: false,
84 + redeemed: false
85 + ),
86 + // Active
87 + OfferModel(
88 + category: "Top offers",
89 + title: "Μόνο 17,95",
90 + description: "2 πίτσες & Coca-Cola 1,5lt",
91 + discount: "17,95€",
92 + discountType: "price",
93 + bannerImage: "dominos_banner",
94 + merchantLogo: "dominos_logo",
95 + expirationDate: "έως 30-09",
96 + color: 0xEE417D,
97 + isFavorite: true,
98 + active: true,
99 + redeemed: false
100 + ),
101 + OfferModel(
102 + category: "Φαγητό και καφές",
103 + title: "2€ έκπτωση",
104 + description: "στην αγορά σου",
105 + discount: "2€",
106 + discountType: "amount",
107 + bannerImage: "coffeeisland_banner",
108 + merchantLogo: "coffeeisland_logo",
109 + expirationDate: "έως 30-09",
110 + color: 0xEE417D,
111 + isFavorite: false,
112 + active: true,
113 + redeemed: false
114 + ),
115 + OfferModel(
116 + category: "Top offers",
117 + title: "10% έκπτωση",
118 + description: "σε γλυκούς πειρασμούς",
119 + discount: "10%",
120 + discountType: "percentage",
121 + bannerImage: "zuccherino_banner",
122 + merchantLogo: "zuccherino_logo",
123 + expirationDate: "έως 30-09",
124 + color: 0xEE417D,
125 + isFavorite: false,
126 + active: true,
127 + redeemed: false
128 + ),
129 + // Απόδραση
130 + OfferModel(
131 + category: "Απόδραση",
132 + title: "10% έκπτωση",
133 + description: "στην διαμονή/διασκέδαση σου",
134 + discount: "10%",
135 + discountType: "percentage",
136 + bannerImage: "ninemia_banner",
137 + merchantLogo: "ninemia_logo",
138 + expirationDate: "έως 30-09",
139 + color: 0xEE417D,
140 + isFavorite: true,
141 + active: false,
142 + redeemed: true
143 + ),
144 + OfferModel(
145 + category: "Παιδί",
146 + title: "1+1 Δώρο",
147 + description: "στην είσοδο του παιδότοπου",
148 + discount: "1+1",
149 + discountType: "buyOneGetOne",
150 + bannerImage: "moustakas_banner",
151 + merchantLogo: "moustakas_logo",
152 + expirationDate: "έως 30-09",
153 + color: 0xEE417D,
154 + isFavorite: false,
155 + active: false,
156 + redeemed: true
157 + ),
158 + // Αγορές
159 + OfferModel(
160 + category: "Αγορές",
161 + title: "15€ έκπτωση",
162 + description: "για αγορές",
163 + discount: "15€",
164 + discountType: "amount",
165 + bannerImage: "migato_banner",
166 + merchantLogo: "migato_logo",
167 + expirationDate: "έως 30-09",
168 + color: 0xEE417D,
169 + isFavorite: false,
170 + active: false,
171 + redeemed: true
172 + )
173 + ]
174 +
175 + var forYouOffersSection: SectionModel?
176 + var activeOffersSection: SectionModel?
177 + var favoriteOffersSection: SectionModel?
178 + var redeemedOffersSection: SectionModel?
179 + var filteredOffersSection: SectionModel?
11 180
12 public override func viewDidLoad() { 181 public override func viewDidLoad() {
13 super.viewDidLoad() 182 super.viewDidLoad()
14 183
15 - // Do any additional setup after loading the view. 184 + // Show navigation bar for this screen (with back button)
185 + self.navigationController?.setNavigationBarHidden(false, animated: false)
186 + setBackButton()
187 + setNavigationTitle("Το προφίλ μου")
188 +
189 + // Register XIBs for table view cells
190 + // tableView.register(UINib(nibName: "MyRewardsBannerOffersScrollTableViewCell", bundle: Bundle(for: MyEmptyClass.self)), forCellReuseIdentifier: "MyRewardsBannerOffersScrollTableViewCell")
191 + // tableView.register(UINib(nibName: "MyRewardsOffersScrollTableViewCell", bundle: Bundle(for: MyEmptyClass.self)), forCellReuseIdentifier: "MyRewardsOffersScrollTableViewCell")
192 +
193 + // Set up table view
194 + tableView.delegate = self
195 + tableView.dataSource = self
196 + tableView.separatorStyle = .none
197 + tableView.estimatedRowHeight = 200
198 + tableView.rowHeight = UITableView.automaticDimension
199 +
200 + initializeSections()
201 + }
202 +
203 + // MARK: Function
204 + func initializeSections() {
205 + // Προτάσεις για εσένα
206 + let forYouOffers = allOffers.filter { $0.category == "Προτάσεις για εσένα" }
207 + forYouOffersSection = SectionModel(
208 + title: "Προτάσεις για εσένα",
209 + count: forYouOffers.count,
210 + offers: forYouOffers
211 + )
212 +
213 + // Favorite Offers
214 + let activeOffers = allOffers.filter { $0.active }
215 + activeOffersSection = SectionModel(
216 + title: "Ενεργά",
217 + count: activeOffers.count,
218 + offers: activeOffers
219 + )
220 +
221 + // Favorite Offers
222 + let favoriteOffers = allOffers.filter { $0.isFavorite }
223 + favoriteOffersSection = SectionModel(
224 + title: "Αγαπημένα",
225 + count: favoriteOffers.count,
226 + offers: favoriteOffers
227 + )
228 +
229 + // Favorite Offers
230 + let redeemedOffers = allOffers.filter { $0.redeemed }
231 + redeemedOffersSection = SectionModel(
232 + title: "Αγαπημένα",
233 + count: redeemedOffers.count,
234 + offers: redeemedOffers
235 + )
236 +
237 + self.tableView.reloadData()
238 + }
239 +}
240 +
241 +// MARK: - TableView
242 +extension MyRewardsViewController: UITableViewDelegate, UITableViewDataSource{
243 +
244 + public func numberOfSections(in tableView: UITableView) -> Int {
245 + return 4 + filteredOffersSection.offers.count
246 + }
247 +
248 + public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
249 + return 1
250 + }
251 +
252 + public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
253 + return UITableView.automaticDimension
254 + }
255 +
256 + public func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
257 + return nil
258 + }
259 +
260 + public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
261 + return 0.0
262 + }
263 +
264 + public func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
265 +// return CGFloat.leastNormalMagnitude
266 + return 0.0
267 + }
268 +
269 + public func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
270 + return nil
16 } 271 }
17 272
273 + public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
274 + if (indexPath.section == 0) {
275 + let cell = tableView.dequeueReusableCell(withIdentifier: "MyRewardsBannerOffersScrollTableViewCell", for: indexPath) as! MyRewardsBannerOffersScrollTableViewCell
276 + cell.delegate = self // Set the banner offers delegate
277 + cell.configureCell(data: self.bannerOffersSection)
278 +// cell.parent = self
279 + return cell
18 280
19 - /* 281 + } else {
20 - // MARK: - Navigation 282 + let cell = tableView.dequeueReusableCell(withIdentifier: "MyRewardsOffersScrollTableViewCell", for: indexPath) as! MyRewardsOffersScrollTableViewCell
283 +
284 + cell.delegate = self // Set the offers delegate
285 +
286 + if (indexPath.section == 1) {
287 + cell.configureCell(data: self.topOffersSection)
288 + } else if (indexPath.section == 2) {
289 + cell.configureCell(data: self.favoriteOffersSection)
290 + } else if (indexPath.section == 3) {
291 + cell.configureCell(data: self.sustainableOffersSection)
292 + } else if (indexPath.section == 4) {
293 + cell.configureCell(data: self.familyOffersSection)
294 + } else if (indexPath.section == 5) {
295 + cell.configureCell(data: self.foodOffersSection)
296 + } else if (indexPath.section == 6) {
297 + cell.configureCell(data: self.escapeOffersSection)
298 + } else if (indexPath.section == 7) {
299 + cell.configureCell(data: self.childOffersSection)
300 + } else {
301 + cell.configureCell(data: self.shoppingOffersSection)
302 + }
303 +
304 + return cell
305 + }
21 306
22 - // In a storyboard-based application, you will often want to do a little preparation before navigation
23 - override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
24 - // Get the new view controller using segue.destination.
25 - // Pass the selected object to the new view controller.
26 } 307 }
27 - */
28 308
309 + public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
310 + if (indexPath.section == 0) {
311 + // Do nothing - Each button is handled differently
312 +
313 + } else if (indexPath.section == 1) {
314 + // Do nothing
315 + } else if (indexPath.section == 2) {
316 + // Do nothing
317 + } else if (indexPath.section == 3) {
318 + // Do nothing
319 + } else if (indexPath.section == 4) {
320 + // Do nothing
321 + } else if (indexPath.section == 5) {
322 + // Do nothing
323 + } else if (indexPath.section == 6) {
324 + // Do nothing
325 + } else if (indexPath.section == 7) {
326 + // Do nothing
327 + } else {
328 + // Do nothing
329 + }
330 + }
29 } 331 }
332 +
......
1 -<?xml version="1.0" encoding="UTF-8" standalone="no"?> 1 +<?xml version="1.0" encoding="UTF-8"?>
2 -<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13142" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> 2 +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23094" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
3 + <device id="retina6_12" orientation="portrait" appearance="light"/>
3 <dependencies> 4 <dependencies>
4 - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12042"/> 5 + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23084"/>
5 <capability name="Safe area layout guides" minToolsVersion="9.0"/> 6 <capability name="Safe area layout guides" minToolsVersion="9.0"/>
7 + <capability name="System colors in document resources" minToolsVersion="11.0"/>
6 <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> 8 <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
7 </dependencies> 9 </dependencies>
8 <objects> 10 <objects>
9 - <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ProfileViewController" customModuleProvider="target"> 11 + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ProfileViewController" customModule="SwiftWarplyFramework" customModuleProvider="target">
10 <connections> 12 <connections>
13 + <outlet property="tableView" destination="Lyp-gB-nMU" id="qcx-6z-teY"/>
11 <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/> 14 <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
12 </connections> 15 </connections>
13 </placeholder> 16 </placeholder>
14 <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> 17 <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
15 <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT"> 18 <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
16 - <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> 19 + <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
17 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> 20 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
18 - <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/> 21 + <subviews>
22 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="35E-2c-fwB" userLabel="Main View">
23 + <rect key="frame" x="0.0" y="59" width="393" height="793"/>
24 + <subviews>
25 + <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" estimatedSectionHeaderHeight="-1" sectionFooterHeight="28" estimatedSectionFooterHeight="-1" contentViewInsetsToSafeArea="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Lyp-gB-nMU">
26 + <rect key="frame" x="0.0" y="0.0" width="393" height="793"/>
27 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
28 + <color key="separatorColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
29 + <color key="sectionIndexBackgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
30 + <connections>
31 + <outlet property="dataSource" destination="-1" id="YLY-kN-FuL"/>
32 + <outlet property="delegate" destination="-1" id="8wu-Tv-kNd"/>
33 + </connections>
34 + </tableView>
35 + </subviews>
36 + <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
37 + <constraints>
38 + <constraint firstItem="Lyp-gB-nMU" firstAttribute="top" secondItem="35E-2c-fwB" secondAttribute="top" id="ZSr-fH-jKR"/>
39 + <constraint firstAttribute="bottom" secondItem="Lyp-gB-nMU" secondAttribute="bottom" id="kxk-Ld-8kk"/>
40 + <constraint firstItem="Lyp-gB-nMU" firstAttribute="leading" secondItem="35E-2c-fwB" secondAttribute="leading" id="nId-cX-Bq6"/>
41 + <constraint firstAttribute="trailing" secondItem="Lyp-gB-nMU" secondAttribute="trailing" id="wzt-qW-Jpz"/>
42 + </constraints>
43 + </view>
44 + </subviews>
19 <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/> 45 <viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
46 + <color key="backgroundColor" systemColor="systemBackgroundColor"/>
47 + <constraints>
48 + <constraint firstAttribute="trailing" secondItem="35E-2c-fwB" secondAttribute="trailing" id="6p0-6e-iUG"/>
49 + <constraint firstItem="35E-2c-fwB" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="GVO-tH-EEu"/>
50 + <constraint firstAttribute="bottom" secondItem="35E-2c-fwB" secondAttribute="bottom" id="Hmw-0d-E4K"/>
51 + <constraint firstItem="35E-2c-fwB" firstAttribute="top" secondItem="fnl-2z-Ty3" secondAttribute="top" id="ajn-1A-hAX"/>
52 + </constraints>
53 + <point key="canvasLocation" x="11" y="-11"/>
20 </view> 54 </view>
21 </objects> 55 </objects>
56 + <resources>
57 + <systemColor name="systemBackgroundColor">
58 + <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
59 + </systemColor>
60 + </resources>
22 </document> 61 </document>
......