Manos Chorianopoulos

CouponsetViewController redesign

...@@ -8,6 +8,31 @@ ...@@ -8,6 +8,31 @@
8 import UIKit 8 import UIKit
9 9
10 extension UIViewController { 10 extension UIViewController {
11 + func addFloatingBackButton(icon: String = "ic_back_3") {
12 + let button = UIButton(type: .custom)
13 + button.translatesAutoresizingMaskIntoConstraints = false
14 + button.backgroundColor = .white
15 + button.layer.cornerRadius = 20
16 + button.layer.shadowColor = UIColor.black.cgColor
17 + button.layer.shadowOpacity = 0.1
18 + button.layer.shadowOffset = CGSize(width: 0, height: 2)
19 + button.layer.shadowRadius = 4
20 +
21 + if let img = UIImage(named: icon, in: Bundle.frameworkResourceBundle, compatibleWith: nil) {
22 + button.setImage(img, for: .normal)
23 + }
24 +
25 + button.addTarget(self, action: #selector(moveToBack(_:)), for: .touchUpInside)
26 +
27 + self.view.addSubview(button)
28 + NSLayoutConstraint.activate([
29 + button.widthAnchor.constraint(equalToConstant: 40),
30 + button.heightAnchor.constraint(equalToConstant: 40),
31 + button.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 16),
32 + button.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor, constant: 16)
33 + ])
34 + }
35 +
11 func setBackButton(_ icon:String = "ic_back_3") { 36 func setBackButton(_ icon:String = "ic_back_3") {
12 // let uiscreen: CGRect = UIScreen.main.bounds 37 // let uiscreen: CGRect = UIScreen.main.bounds
13 38
...@@ -247,6 +272,20 @@ extension UIView { ...@@ -247,6 +272,20 @@ extension UIView {
247 lineLayer.path = path 272 lineLayer.path = path
248 self.layer.addSublayer(lineLayer) 273 self.layer.addSublayer(lineLayer)
249 } 274 }
275 +
276 + func addDashedBorder(color: UIColor, lineWidth: CGFloat = 1, dash: CGFloat = 3, gap: CGFloat = 3) {
277 + // Remove any existing dashed border layer to avoid duplicates on re-layout
278 + layer.sublayers?.removeAll(where: { $0.name == "dashedBorderLayer" })
279 +
280 + let shapeLayer = CAShapeLayer()
281 + shapeLayer.name = "dashedBorderLayer"
282 + shapeLayer.strokeColor = color.cgColor
283 + shapeLayer.fillColor = UIColor.clear.cgColor
284 + shapeLayer.lineWidth = lineWidth
285 + shapeLayer.lineDashPattern = [dash as NSNumber, gap as NSNumber]
286 + shapeLayer.path = UIBezierPath(rect: bounds).cgPath
287 + layer.addSublayer(shapeLayer)
288 + }
250 } 289 }
251 290
252 extension UIImageView { 291 extension UIImageView {
......
...@@ -30,8 +30,10 @@ import UIKit ...@@ -30,8 +30,10 @@ import UIKit
30 @IBOutlet weak var favoriteImage: UIImageView! 30 @IBOutlet weak var favoriteImage: UIImageView!
31 @IBOutlet weak var shareImage: UIImageView! 31 @IBOutlet weak var shareImage: UIImageView!
32 32
33 + @IBOutlet weak var merchantNameLabel: UILabel!
33 @IBOutlet weak var titleLabel: UILabel! 34 @IBOutlet weak var titleLabel: UILabel!
34 @IBOutlet weak var subtitleLabel: UILabel! 35 @IBOutlet weak var subtitleLabel: UILabel!
36 + @IBOutlet weak var expirationView: UIView!
35 @IBOutlet weak var expirationLabel: UILabel! 37 @IBOutlet weak var expirationLabel: UILabel!
36 @IBOutlet weak var detailsLabel: UILabel! 38 @IBOutlet weak var detailsLabel: UILabel!
37 39
...@@ -75,9 +77,19 @@ import UIKit ...@@ -75,9 +77,19 @@ import UIKit
75 super.viewDidLoad() 77 super.viewDidLoad()
76 78
77 // Show navigation bar for this screen (with back button) 79 // Show navigation bar for this screen (with back button)
78 - self.navigationController?.setNavigationBarHidden(false, animated: false) 80 + // self.navigationController?.setNavigationBarHidden(false, animated: false)
79 - setBackButton() 81 + // setBackButton()
80 - setNavigationTitle("Προσφορά") 82 + // setNavigationTitle("Προσφορά")
83 +
84 + self.navigationController?.setNavigationBarHidden(true, animated: false)
85 + addFloatingBackButton()
86 +
87 + for label in [merchantNameLabel, titleLabel, subtitleLabel, expirationLabel, detailsLabel] {
88 + label?.setContentHuggingPriority(.defaultHigh, for: .vertical)
89 + }
90 +
91 +
92 + couponImage.backgroundColor = UIColor(rgb: 0x00A3E033)
81 93
82 infoView.backgroundColor = UIColor(rgb: 0xFFFFFF) 94 infoView.backgroundColor = UIColor(rgb: 0xFFFFFF)
83 infoView.layer.cornerRadius = 10.0 95 infoView.layer.cornerRadius = 10.0
...@@ -92,18 +104,26 @@ import UIKit ...@@ -92,18 +104,26 @@ import UIKit
92 infoLabel.textColor = UIColor(rgb: 0x020E1C) 104 infoLabel.textColor = UIColor(rgb: 0x020E1C)
93 infoLabel.text = "Περισσότερα" 105 infoLabel.text = "Περισσότερα"
94 106
95 - termsButtonTitleLabel.font = UIFont(name: "PingLCG-Bold", size: 16) 107 + expirationView.backgroundColor = UIColor(rgb: 0xDDEFFB)
96 - termsButtonTitleLabel.textColor = UIColor(rgb: 0x020E1C) 108 + expirationView.layer.cornerRadius = 6.0
97 - termsButtonTitleLabel.text = "Όροι Χρήσης" 109 + expirationView.layer.borderWidth = 1.0
110 + expirationView.layer.borderColor = UIColor(rgb: 0xCCE9FB).cgColor
111 +
112 + termsButtonTitleLabel.font = UIFont(name: "PingLCG-Bold", size: 15)
113 + termsButtonTitleLabel.textColor = UIColor(rgb: 0x5C6369)
114 + // termsButtonTitleLabel.text = "Όροι Χρήσης"
115 + termsButtonTitleLabel.text = "Offer terms of use"
98 termsButton.addTarget(self, action: #selector(toggleTerms), for: .touchUpInside) 116 termsButton.addTarget(self, action: #selector(toggleTerms), for: .touchUpInside)
99 termsLabelHeight.constant = 0 117 termsLabelHeight.constant = 0
100 118
101 - redeemButton.titleLabel?.font = UIFont(name: "PingLCG-Bold", size: 16) 119 + redeemButton.titleLabel?.font = UIFont(name: "PingLCG-Regular", size: 16)
102 - redeemButton.setTitle("Απόκτησε το κουπόνι", for: .normal) 120 + // redeemButton.setTitle("Απόκτησε το κουπόνι", for: .normal)
121 + redeemButton.setTitle("Get coupon", for: .normal)
103 redeemButton.setTitleColor(UIColor(rgb: 0xFFFFFF), for: .normal) 122 redeemButton.setTitleColor(UIColor(rgb: 0xFFFFFF), for: .normal)
104 redeemButton.setTitleColor(UIColor(rgb: 0xFFFFFF), for: .highlighted) 123 redeemButton.setTitleColor(UIColor(rgb: 0xFFFFFF), for: .highlighted)
105 - redeemButton.layer.cornerRadius = 4.0 124 + redeemButton.layer.cornerRadius = redeemButton.bounds.height / 2
106 - redeemButton.backgroundColor = UIColor(rgb: 0x000F1E) 125 + // redeemButton.backgroundColor = UIColor(rgb: 0x000F1E)
126 + redeemButton.backgroundColor = UIColor(rgb: 0x00A3E0)
107 redeemButton.addTarget(self, action: #selector(redeemButtonTapped), for: .touchUpInside) 127 redeemButton.addTarget(self, action: #selector(redeemButtonTapped), for: .touchUpInside)
108 128
109 // Configure the view with offer data 129 // Configure the view with offer data
...@@ -112,6 +132,28 @@ import UIKit ...@@ -112,6 +132,28 @@ import UIKit
112 } 132 }
113 } 133 }
114 134
135 + public override func viewDidLayoutSubviews() {
136 + super.viewDidLayoutSubviews()
137 + redeemButton.layer.cornerRadius = redeemButton.bounds.height / 2
138 +
139 + couponImage.addDashedBorder(
140 + color: UIColor(rgb: 0x00A3E033),
141 + lineWidth: 1,
142 + dash: 3,
143 + gap: 3
144 + )
145 + }
146 +
147 + public override func viewWillAppear(_ animated: Bool) {
148 + super.viewWillAppear(animated)
149 + self.navigationController?.setNavigationBarHidden(true, animated: animated)
150 + }
151 +
152 + public override func viewWillDisappear(_ animated: Bool) {
153 + super.viewWillDisappear(animated)
154 + self.navigationController?.setNavigationBarHidden(false, animated: animated)
155 + }
156 +
115 @objc private func redeemButtonTapped() { 157 @objc private func redeemButtonTapped() {
116 guard let couponSetUuid = couponset?._uuid, !couponSetUuid.isEmpty else { 158 guard let couponSetUuid = couponset?._uuid, !couponSetUuid.isEmpty else {
117 showErrorAlert(message: "Δεν βρέθηκε το αναγνωριστικό της προσφοράς.") 159 showErrorAlert(message: "Δεν βρέθηκε το αναγνωριστικό της προσφοράς.")
...@@ -216,23 +258,28 @@ import UIKit ...@@ -216,23 +258,28 @@ import UIKit
216 // Default to not favorite for coupon sets 258 // Default to not favorite for coupon sets
217 favoriteImage.image = UIImage(named: "favorite2_empty", in: Bundle.frameworkResourceBundle, compatibleWith: nil) 259 favoriteImage.image = UIImage(named: "favorite2_empty", in: Bundle.frameworkResourceBundle, compatibleWith: nil)
218 260
261 + merchantNameLabel.font = UIFont(name: "PingLCG-Bold", size: 15)
262 + merchantNameLabel.textColor = UIColor(rgb: 0x9BA1A6)
263 + merchantNameLabel.text = couponset._merchant?._name
264 +
219 titleLabel.font = UIFont(name: "PingLCG-Bold", size: 24) 265 titleLabel.font = UIFont(name: "PingLCG-Bold", size: 24)
220 - titleLabel.textColor = UIColor(rgb: 0xF2709D) 266 + titleLabel.textColor = UIColor(rgb: 0x000F1E)
221 titleLabel.text = couponset._name 267 titleLabel.text = couponset._name
222 268
223 subtitleLabel.font = UIFont(name: "PingLCG-Regular", size: 18) 269 subtitleLabel.font = UIFont(name: "PingLCG-Regular", size: 18)
224 - subtitleLabel.textColor = UIColor(rgb: 0x020E1C) 270 + subtitleLabel.textColor = UIColor(rgb: 0x000F1E)
225 subtitleLabel.text = couponset._short_description 271 subtitleLabel.text = couponset._short_description
226 272
227 - expirationLabel.font = UIFont(name: "PingLCG-Regular", size: 14) 273 + expirationLabel.font = UIFont(name: "PingLCG-Bold", size: 13)
228 - expirationLabel.textColor = UIColor(rgb: 0x020E1C) 274 + expirationLabel.textColor = UIColor(rgb: 0x002430)
229 - expirationLabel.text = ("Η προσφορά ισχύει έως " + couponset.formattedEndDate(format: "dd-MM-yyyy")) 275 + expirationLabel.text = ("Valid until " + couponset.formattedEndDate(format: "MMMM d, yyyy"))
276 +// expirationLabel.text = ("Η προσφορά ισχύει έως " + couponset.formattedEndDate(format: "dd-MM-yyyy"))
230 // expirationLabel.text = "Η προσφορά ισχύει έως 30-09-2025" 277 // expirationLabel.text = "Η προσφορά ισχύει έως 30-09-2025"
231 278
232 setupExpandableDetails() 279 setupExpandableDetails()
233 280
234 - termsLabel.font = UIFont(name: "PingLCG-Regular", size: 16) 281 + termsLabel.font = UIFont(name: "PingLCG-Regular", size: 15)
235 - termsLabel.textColor = UIColor(rgb: 0x020E1C) 282 + termsLabel.textColor = UIColor(rgb: 0x5C6369)
236 // termsLabel.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed ex euismod, feugiat justo eu, faucibus urna. Nulla sodales euismod arcu volutpat finibus. Etiam id urna at justo facilisis tempor. Morbi dignissim erat vitae magna sodales dignissim ac in mauris. Mauris tempor convallis tortor, interdum hendrerit turpis eleifend at. Praesent." 283 // termsLabel.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed ex euismod, feugiat justo eu, faucibus urna. Nulla sodales euismod arcu volutpat finibus. Etiam id urna at justo facilisis tempor. Morbi dignissim erat vitae magna sodales dignissim ac in mauris. Mauris tempor convallis tortor, interdum hendrerit turpis eleifend at. Praesent."
237 termsLabel.text = couponset._terms 284 termsLabel.text = couponset._terms
238 } 285 }
...@@ -244,8 +291,8 @@ import UIKit ...@@ -244,8 +291,8 @@ import UIKit
244 // fullDetailsText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed ex euismod, feugiat justo eu, faucibus urna. Nulla sodales euismod arcu volutpat finibus. Etiam id urna at justo facilisis tempor. Morbi dignissim erat vitae magna sodales dignissim ac in mauris. Mauris tempor convallis tortor, interdum hendrerit turpis eleifend at. Praesent." 291 // fullDetailsText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed ex euismod, feugiat justo eu, faucibus urna. Nulla sodales euismod arcu volutpat finibus. Etiam id urna at justo facilisis tempor. Morbi dignissim erat vitae magna sodales dignissim ac in mauris. Mauris tempor convallis tortor, interdum hendrerit turpis eleifend at. Praesent."
245 fullDetailsText = couponset?._description ?? "" 292 fullDetailsText = couponset?._description ?? ""
246 293
247 - detailsLabel.font = UIFont(name: "PingLCG-Regular", size: 18) 294 + detailsLabel.font = UIFont(name: "PingLCG-Regular", size: 16)
248 - detailsLabel.textColor = UIColor(rgb: 0x020E1C) 295 + detailsLabel.textColor = UIColor(rgb: 0x5C6369)
249 296
250 updateDetailsText() 297 updateDetailsText()
251 298
...@@ -258,8 +305,11 @@ import UIKit ...@@ -258,8 +305,11 @@ import UIKit
258 if isDetailsExpanded { 305 if isDetailsExpanded {
259 // Show full text with "Λιγότερα" 306 // Show full text with "Λιγότερα"
260 if (shouldTruncaitDetails) { 307 if (shouldTruncaitDetails) {
261 - let fullTextWithLess = fullDetailsText + " Λιγότερα" 308 +// let fullTextWithLess = fullDetailsText + " Λιγότερα"
262 - let attributedString = createAttributedString(text: fullTextWithLess, linkText: "Λιγότερα") 309 +// let attributedString = createAttributedString(text: fullTextWithLess, linkText: "Λιγότερα")
310 +
311 + let fullTextWithLess = fullDetailsText + " View less"
312 + let attributedString = createAttributedString(text: fullTextWithLess, linkText: "View less")
263 detailsLabel.attributedText = attributedString 313 detailsLabel.attributedText = attributedString
264 } else { 314 } else {
265 detailsLabel.text = fullDetailsText 315 detailsLabel.text = fullDetailsText
...@@ -267,8 +317,10 @@ import UIKit ...@@ -267,8 +317,10 @@ import UIKit
267 detailsLabel.numberOfLines = 0 317 detailsLabel.numberOfLines = 0
268 } else { 318 } else {
269 // Calculate approximate characters for 4 lines and truncate if needed 319 // Calculate approximate characters for 4 lines and truncate if needed
320 +// let truncatedText = getTruncatedTextForFourLines()
321 +// let attributedString = createAttributedString(text: truncatedText, linkText: "Περισσότερα")
270 let truncatedText = getTruncatedTextForFourLines() 322 let truncatedText = getTruncatedTextForFourLines()
271 - let attributedString = createAttributedString(text: truncatedText, linkText: "Περισσότερα") 323 + let attributedString = createAttributedString(text: truncatedText, linkText: "View more")
272 detailsLabel.attributedText = attributedString 324 detailsLabel.attributedText = attributedString
273 detailsLabel.numberOfLines = 4 325 detailsLabel.numberOfLines = 4
274 } 326 }
...@@ -282,7 +334,8 @@ import UIKit ...@@ -282,7 +334,8 @@ import UIKit
282 let charactersPerLine = Int(labelWidth / averageCharWidth) 334 let charactersPerLine = Int(labelWidth / averageCharWidth)
283 let maxCharactersFor4Lines = charactersPerLine * 4 335 let maxCharactersFor4Lines = charactersPerLine * 4
284 336
285 - let moreText = " Περισσότερα" 337 +// let moreText = " Περισσότερα"
338 + let moreText = " View more"
286 let ellipsis = "..." 339 let ellipsis = "..."
287 let reservedCharacters = ellipsis.count + moreText.count + 15 340 let reservedCharacters = ellipsis.count + moreText.count + 15
288 341
...@@ -307,14 +360,14 @@ import UIKit ...@@ -307,14 +360,14 @@ import UIKit
307 360
308 // Regular text attributes 361 // Regular text attributes
309 let regularAttributes: [NSAttributedString.Key: Any] = [ 362 let regularAttributes: [NSAttributedString.Key: Any] = [
310 - .font: UIFont(name: "PingLCG-Regular", size: 18) ?? UIFont.systemFont(ofSize: 18), 363 + .font: UIFont(name: "PingLCG-Regular", size: 16) ?? UIFont.systemFont(ofSize: 16),
311 - .foregroundColor: UIColor(rgb: 0x020E1C) 364 + .foregroundColor: UIColor(rgb: 0x5C6369)
312 ] 365 ]
313 366
314 // Link text attributes (blue color) 367 // Link text attributes (blue color)
315 let linkAttributes: [NSAttributedString.Key: Any] = [ 368 let linkAttributes: [NSAttributedString.Key: Any] = [
316 - .font: UIFont(name: "PingLCG-Regular", size: 18) ?? UIFont.systemFont(ofSize: 18), 369 + .font: UIFont(name: "PingLCG-Bold", size: 16) ?? UIFont.systemFont(ofSize: 16),
317 - .foregroundColor: UIColor(rgb: 0x00A8E8) // Blue color 370 + .foregroundColor: UIColor(rgb: 0x1D2023) // Blue color
318 ] 371 ]
319 372
320 // Apply regular attributes to entire text 373 // Apply regular attributes to entire text
......
...@@ -13,10 +13,12 @@ ...@@ -13,10 +13,12 @@
13 <outlet property="couponImage" destination="50f-Uw-WmD" id="yxn-pQ-nCT"/> 13 <outlet property="couponImage" destination="50f-Uw-WmD" id="yxn-pQ-nCT"/>
14 <outlet property="detailsLabel" destination="tOt-gP-Et5" id="H2V-Uq-Dsj"/> 14 <outlet property="detailsLabel" destination="tOt-gP-Et5" id="H2V-Uq-Dsj"/>
15 <outlet property="expirationLabel" destination="PZ8-Go-A85" id="hXE-lo-i0w"/> 15 <outlet property="expirationLabel" destination="PZ8-Go-A85" id="hXE-lo-i0w"/>
16 + <outlet property="expirationView" destination="Haz-Ae-VkM" id="OMt-Fr-BW4"/>
16 <outlet property="favoriteImage" destination="kQb-LM-Zaa" id="75J-Ez-RZx"/> 17 <outlet property="favoriteImage" destination="kQb-LM-Zaa" id="75J-Ez-RZx"/>
17 <outlet property="infoImage" destination="RK8-R9-SZK" id="ZjM-PX-DgT"/> 18 <outlet property="infoImage" destination="RK8-R9-SZK" id="ZjM-PX-DgT"/>
18 <outlet property="infoLabel" destination="oln-Zl-Mu1" id="OZb-dV-dlF"/> 19 <outlet property="infoLabel" destination="oln-Zl-Mu1" id="OZb-dV-dlF"/>
19 <outlet property="infoView" destination="raJ-sJ-NGX" id="fol-KV-D65"/> 20 <outlet property="infoView" destination="raJ-sJ-NGX" id="fol-KV-D65"/>
21 + <outlet property="merchantNameLabel" destination="S6F-Nw-LLu" id="fCY-8O-usr"/>
20 <outlet property="redeemButton" destination="bTa-jT-Ufb" id="zz9-GB-5CD"/> 22 <outlet property="redeemButton" destination="bTa-jT-Ufb" id="zz9-GB-5CD"/>
21 <outlet property="shareImage" destination="a1t-wH-dMg" id="Viw-KD-1JB"/> 23 <outlet property="shareImage" destination="a1t-wH-dMg" id="Viw-KD-1JB"/>
22 <outlet property="subtitleLabel" destination="iWC-mi-WKw" id="peM-oa-eSS"/> 24 <outlet property="subtitleLabel" destination="iWC-mi-WKw" id="peM-oa-eSS"/>
...@@ -78,8 +80,8 @@ ...@@ -78,8 +80,8 @@
78 <constraint firstItem="oln-Zl-Mu1" firstAttribute="leading" secondItem="RK8-R9-SZK" secondAttribute="trailing" constant="4.5" id="uSA-Gk-Fws"/> 80 <constraint firstItem="oln-Zl-Mu1" firstAttribute="leading" secondItem="RK8-R9-SZK" secondAttribute="trailing" constant="4.5" id="uSA-Gk-Fws"/>
79 </constraints> 81 </constraints>
80 </view> 82 </view>
81 - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Label" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aSO-pm-a0W" userLabel="Title Label"> 83 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="S6F-Nw-LLu" userLabel="Merchant Name Label">
82 - <rect key="frame" x="24" y="234" width="249" height="20.333333333333343"/> 84 + <rect key="frame" x="24" y="235" width="345" height="20.333333333333343"/>
83 <fontDescription key="fontDescription" type="system" pointSize="17"/> 85 <fontDescription key="fontDescription" type="system" pointSize="17"/>
84 <nil key="textColor"/> 86 <nil key="textColor"/>
85 <nil key="highlightedColor"/> 87 <nil key="highlightedColor"/>
...@@ -100,26 +102,52 @@ ...@@ -100,26 +102,52 @@
100 <constraint firstAttribute="height" constant="40" id="Woz-Er-jU5"/> 102 <constraint firstAttribute="height" constant="40" id="Woz-Er-jU5"/>
101 </constraints> 103 </constraints>
102 </imageView> 104 </imageView>
103 - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iWC-mi-WKw" userLabel="Subtitle Label"> 105 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aSO-pm-a0W" userLabel="Title Label">
104 - <rect key="frame" x="24" y="254.33333333333334" width="345" height="20.333333333333286"/> 106 + <rect key="frame" x="24" y="274.33333333333331" width="345" height="20.333333333333314"/>
105 <fontDescription key="fontDescription" type="system" pointSize="17"/> 107 <fontDescription key="fontDescription" type="system" pointSize="17"/>
106 <nil key="textColor"/> 108 <nil key="textColor"/>
107 <nil key="highlightedColor"/> 109 <nil key="highlightedColor"/>
108 </label> 110 </label>
109 - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PZ8-Go-A85" userLabel="Expiration Label"> 111 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iWC-mi-WKw" userLabel="Subtitle Label">
110 - <rect key="frame" x="24" y="288.66666666666674" width="345" height="20.333333333333314"/> 112 + <rect key="frame" x="24" y="304.66666666666669" width="345" height="20.333333333333314"/>
111 <fontDescription key="fontDescription" type="system" pointSize="17"/> 113 <fontDescription key="fontDescription" type="system" pointSize="17"/>
112 <nil key="textColor"/> 114 <nil key="textColor"/>
113 <nil key="highlightedColor"/> 115 <nil key="highlightedColor"/>
114 </label> 116 </label>
115 - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tOt-gP-Et5" userLabel="Details Label"> 117 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Haz-Ae-VkM" userLabel="Expiration View">
116 - <rect key="frame" x="24" y="329" width="345" height="20.333333333333314"/> 118 + <rect key="frame" x="24.000000000000004" y="347" width="55.333333333333343" height="34.333333333333314"/>
119 + <subviews>
120 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PZ8-Go-A85" userLabel="Expiration Label">
121 + <rect key="frame" x="7" y="6.9999999999999982" width="41.333333333333336" height="20.333333333333329"/>
122 + <fontDescription key="fontDescription" type="system" pointSize="17"/>
123 + <nil key="textColor"/>
124 + <nil key="highlightedColor"/>
125 + </label>
126 + </subviews>
127 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
128 + <constraints>
129 + <constraint firstItem="PZ8-Go-A85" firstAttribute="leading" secondItem="Haz-Ae-VkM" secondAttribute="leading" constant="7" id="GHg-uf-y2A"/>
130 + <constraint firstAttribute="bottom" secondItem="PZ8-Go-A85" secondAttribute="bottom" constant="7" id="lzh-zn-eSc"/>
131 + <constraint firstAttribute="trailing" secondItem="PZ8-Go-A85" secondAttribute="trailing" constant="7" id="mOL-XE-ayp"/>
132 + <constraint firstItem="PZ8-Go-A85" firstAttribute="top" secondItem="Haz-Ae-VkM" secondAttribute="top" constant="7" id="u2c-QD-K7q"/>
133 + </constraints>
134 + </view>
135 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tOt-gP-Et5" userLabel="Details Label">
136 + <rect key="frame" x="24" y="418.33333333333337" width="345" height="20.333333333333314"/>
117 <fontDescription key="fontDescription" type="system" pointSize="17"/> 137 <fontDescription key="fontDescription" type="system" pointSize="17"/>
118 <nil key="textColor"/> 138 <nil key="textColor"/>
119 <nil key="highlightedColor"/> 139 <nil key="highlightedColor"/>
120 </label> 140 </label>
141 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bTa-jT-Ufb" userLabel="RedeemButton">
142 + <rect key="frame" x="24" y="541.66666666666663" width="345" height="55"/>
143 + <constraints>
144 + <constraint firstAttribute="height" constant="55" id="5AV-zY-O6v"/>
145 + </constraints>
146 + <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
147 + <state key="normal" title="Button"/>
148 + </button>
121 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="12M-YC-Cox" userLabel="TermsButtonView"> 149 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="12M-YC-Cox" userLabel="TermsButtonView">
122 - <rect key="frame" x="23.999999999999993" y="527.66666666666663" width="123.33333333333331" height="35"/> 150 + <rect key="frame" x="135" y="628.66666666666663" width="123.33333333333331" height="35"/>
123 <subviews> 151 <subviews>
124 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Όροι Χρήσης" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uSf-AS-iFa" userLabel="TermsButtonTitleLabel"> 152 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Όροι Χρήσης" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uSf-AS-iFa" userLabel="TermsButtonTitleLabel">
125 <rect key="frame" x="0.0" y="5" width="101.33333333333333" height="25"/> 153 <rect key="frame" x="0.0" y="5" width="101.33333333333333" height="25"/>
...@@ -159,7 +187,7 @@ ...@@ -159,7 +187,7 @@
159 </constraints> 187 </constraints>
160 </view> 188 </view>
161 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jug-xV-lmv" userLabel="TermsLabel"> 189 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jug-xV-lmv" userLabel="TermsLabel">
162 - <rect key="frame" x="24" y="572.66666666666663" width="345" height="20.333333333333371"/> 190 + <rect key="frame" x="24" y="673.66666666666663" width="345" height="20.333333333333371"/>
163 <constraints> 191 <constraints>
164 <constraint firstAttribute="height" constant="20.329999999999998" id="9VB-9j-Q79"/> 192 <constraint firstAttribute="height" constant="20.329999999999998" id="9VB-9j-Q79"/>
165 </constraints> 193 </constraints>
...@@ -167,48 +195,49 @@ ...@@ -167,48 +195,49 @@
167 <nil key="textColor"/> 195 <nil key="textColor"/>
168 <nil key="highlightedColor"/> 196 <nil key="highlightedColor"/>
169 </label> 197 </label>
170 - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bTa-jT-Ufb" userLabel="RedeemButton">
171 - <rect key="frame" x="24" y="633" width="345" height="55"/>
172 - <constraints>
173 - <constraint firstAttribute="height" constant="55" id="5AV-zY-O6v"/>
174 - </constraints>
175 - <state key="normal" title="Button"/>
176 - <buttonConfiguration key="configuration" style="plain" title="Button"/>
177 - </button>
178 </subviews> 198 </subviews>
179 <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> 199 <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
180 <constraints> 200 <constraints>
181 - <constraint firstAttribute="trailing" secondItem="PZ8-Go-A85" secondAttribute="trailing" constant="24" id="0BS-5a-p2w"/> 201 + <constraint firstItem="S6F-Nw-LLu" firstAttribute="top" secondItem="50f-Uw-WmD" secondAttribute="bottom" constant="24" id="0hI-ba-ISV"/>
182 <constraint firstAttribute="trailing" secondItem="raJ-sJ-NGX" secondAttribute="trailing" constant="16" id="3pn-zS-erd"/> 202 <constraint firstAttribute="trailing" secondItem="raJ-sJ-NGX" secondAttribute="trailing" constant="16" id="3pn-zS-erd"/>
183 <constraint firstAttribute="trailing" secondItem="50f-Uw-WmD" secondAttribute="trailing" id="5vF-D2-mBO"/> 203 <constraint firstAttribute="trailing" secondItem="50f-Uw-WmD" secondAttribute="trailing" id="5vF-D2-mBO"/>
184 - <constraint firstItem="12M-YC-Cox" firstAttribute="top" secondItem="tOt-gP-Et5" secondAttribute="bottom" constant="50" id="6cC-FH-1Xw"/> 204 + <constraint firstItem="12M-YC-Cox" firstAttribute="top" secondItem="bTa-jT-Ufb" secondAttribute="bottom" constant="32" id="6cC-FH-1Xw"/>
185 <constraint firstItem="50f-Uw-WmD" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" id="7Rd-U6-d9j"/> 205 <constraint firstItem="50f-Uw-WmD" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" id="7Rd-U6-d9j"/>
206 + <constraint firstItem="Haz-Ae-VkM" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="Aks-Ge-qWd"/>
186 <constraint firstItem="aSO-pm-a0W" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="BIn-gA-oSw"/> 207 <constraint firstItem="aSO-pm-a0W" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="BIn-gA-oSw"/>
187 <constraint firstItem="a1t-wH-dMg" firstAttribute="leading" secondItem="kQb-LM-Zaa" secondAttribute="trailing" constant="11" id="DlZ-NN-vE2"/> 208 <constraint firstItem="a1t-wH-dMg" firstAttribute="leading" secondItem="kQb-LM-Zaa" secondAttribute="trailing" constant="11" id="DlZ-NN-vE2"/>
188 - <constraint firstItem="12M-YC-Cox" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="Eal-pm-W9t"/>
189 - <constraint firstItem="PZ8-Go-A85" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="Fgh-6n-hpZ"/>
190 <constraint firstAttribute="trailing" secondItem="a1t-wH-dMg" secondAttribute="trailing" constant="18" id="H8F-yd-t0Z"/> 209 <constraint firstAttribute="trailing" secondItem="a1t-wH-dMg" secondAttribute="trailing" constant="18" id="H8F-yd-t0Z"/>
191 <constraint firstAttribute="trailing" secondItem="iWC-mi-WKw" secondAttribute="trailing" constant="24" id="HII-Zz-ySA"/> 210 <constraint firstAttribute="trailing" secondItem="iWC-mi-WKw" secondAttribute="trailing" constant="24" id="HII-Zz-ySA"/>
192 - <constraint firstItem="iWC-mi-WKw" firstAttribute="top" secondItem="aSO-pm-a0W" secondAttribute="bottom" id="HZs-3D-vZV"/> 211 + <constraint firstItem="iWC-mi-WKw" firstAttribute="top" secondItem="aSO-pm-a0W" secondAttribute="bottom" constant="10" id="HZs-3D-vZV"/>
193 - <constraint firstItem="kQb-LM-Zaa" firstAttribute="leading" secondItem="aSO-pm-a0W" secondAttribute="trailing" constant="11" id="MAX-rt-Ne3"/> 212 + <constraint firstItem="12M-YC-Cox" firstAttribute="centerX" secondItem="mci-HQ-9iu" secondAttribute="centerX" id="Je8-Mw-E6T"/>
194 - <constraint firstItem="PZ8-Go-A85" firstAttribute="top" secondItem="iWC-mi-WKw" secondAttribute="bottom" constant="14" id="PYW-1u-Cgl"/> 213 + <constraint firstItem="S6F-Nw-LLu" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="OfG-yU-B7K"/>
195 <constraint firstAttribute="trailing" secondItem="bTa-jT-Ufb" secondAttribute="trailing" constant="24" id="Qcz-Xf-6ks"/> 214 <constraint firstAttribute="trailing" secondItem="bTa-jT-Ufb" secondAttribute="trailing" constant="24" id="Qcz-Xf-6ks"/>
196 <constraint firstAttribute="trailing" secondItem="tOt-gP-Et5" secondAttribute="trailing" constant="24" id="TEj-0l-zzv"/> 215 <constraint firstAttribute="trailing" secondItem="tOt-gP-Et5" secondAttribute="trailing" constant="24" id="TEj-0l-zzv"/>
197 - <constraint firstItem="bTa-jT-Ufb" firstAttribute="top" secondItem="jug-xV-lmv" secondAttribute="bottom" constant="40" id="WGs-Pa-TME"/> 216 + <constraint firstAttribute="trailing" secondItem="S6F-Nw-LLu" secondAttribute="trailing" constant="24" id="XIV-gu-A7t"/>
198 <constraint firstItem="kQb-LM-Zaa" firstAttribute="top" secondItem="50f-Uw-WmD" secondAttribute="bottom" constant="17" id="Z5G-42-yfN"/> 217 <constraint firstItem="kQb-LM-Zaa" firstAttribute="top" secondItem="50f-Uw-WmD" secondAttribute="bottom" constant="17" id="Z5G-42-yfN"/>
199 <constraint firstItem="50f-Uw-WmD" firstAttribute="top" secondItem="mci-HQ-9iu" secondAttribute="top" id="a5j-3R-Mwh"/> 218 <constraint firstItem="50f-Uw-WmD" firstAttribute="top" secondItem="mci-HQ-9iu" secondAttribute="top" id="a5j-3R-Mwh"/>
200 <constraint firstAttribute="trailing" secondItem="jug-xV-lmv" secondAttribute="trailing" constant="24" id="b0Q-bb-wh3"/> 219 <constraint firstAttribute="trailing" secondItem="jug-xV-lmv" secondAttribute="trailing" constant="24" id="b0Q-bb-wh3"/>
201 <constraint firstItem="a1t-wH-dMg" firstAttribute="top" secondItem="50f-Uw-WmD" secondAttribute="bottom" constant="17" id="bSw-JI-jDV"/> 220 <constraint firstItem="a1t-wH-dMg" firstAttribute="top" secondItem="50f-Uw-WmD" secondAttribute="bottom" constant="17" id="bSw-JI-jDV"/>
202 <constraint firstItem="iWC-mi-WKw" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="dMq-cH-vOX"/> 221 <constraint firstItem="iWC-mi-WKw" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="dMq-cH-vOX"/>
222 + <constraint firstAttribute="bottom" secondItem="jug-xV-lmv" secondAttribute="bottom" constant="40" id="eha-mA-4uW"/>
203 <constraint firstItem="raJ-sJ-NGX" firstAttribute="top" secondItem="mci-HQ-9iu" secondAttribute="top" constant="17" id="g7b-Ql-ifv"/> 223 <constraint firstItem="raJ-sJ-NGX" firstAttribute="top" secondItem="mci-HQ-9iu" secondAttribute="top" constant="17" id="g7b-Ql-ifv"/>
204 - <constraint firstItem="aSO-pm-a0W" firstAttribute="top" secondItem="50f-Uw-WmD" secondAttribute="bottom" constant="23" id="jvc-rb-E6b"/> 224 + <constraint firstItem="aSO-pm-a0W" firstAttribute="top" secondItem="S6F-Nw-LLu" secondAttribute="bottom" constant="19" id="jvc-rb-E6b"/>
205 - <constraint firstItem="tOt-gP-Et5" firstAttribute="top" secondItem="PZ8-Go-A85" secondAttribute="bottom" constant="20" id="kQ3-4v-3Jp"/> 225 + <constraint firstItem="Haz-Ae-VkM" firstAttribute="top" secondItem="iWC-mi-WKw" secondAttribute="bottom" constant="22" id="kB9-ra-WhU"/>
206 <constraint firstItem="jug-xV-lmv" firstAttribute="top" secondItem="12M-YC-Cox" secondAttribute="bottom" constant="9.9999999999998863" id="kSx-qT-pPa"/> 226 <constraint firstItem="jug-xV-lmv" firstAttribute="top" secondItem="12M-YC-Cox" secondAttribute="bottom" constant="9.9999999999998863" id="kSx-qT-pPa"/>
207 - <constraint firstAttribute="bottom" secondItem="bTa-jT-Ufb" secondAttribute="bottom" constant="46" id="l42-O3-RQt"/> 227 + <constraint firstItem="tOt-gP-Et5" firstAttribute="top" secondItem="Haz-Ae-VkM" secondAttribute="bottom" constant="37" id="kzo-cb-j7v"/>
208 <constraint firstItem="bTa-jT-Ufb" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="nR2-Py-LTi"/> 228 <constraint firstItem="bTa-jT-Ufb" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="nR2-Py-LTi"/>
229 + <constraint firstItem="bTa-jT-Ufb" firstAttribute="top" relation="greaterThanOrEqual" secondItem="tOt-gP-Et5" secondAttribute="bottom" constant="50" id="nSD-Oa-JCj"/>
209 <constraint firstItem="jug-xV-lmv" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="oUa-cz-J7N"/> 230 <constraint firstItem="jug-xV-lmv" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="oUa-cz-J7N"/>
231 + <constraint firstAttribute="trailing" secondItem="aSO-pm-a0W" secondAttribute="trailing" constant="24" id="wfZ-SS-Kno"/>
210 <constraint firstItem="tOt-gP-Et5" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="xz5-C4-0GD"/> 232 <constraint firstItem="tOt-gP-Et5" firstAttribute="leading" secondItem="mci-HQ-9iu" secondAttribute="leading" constant="24" id="xz5-C4-0GD"/>
211 </constraints> 233 </constraints>
234 + <variation key="default">
235 + <mask key="subviews">
236 + <exclude reference="raJ-sJ-NGX"/>
237 + <exclude reference="kQb-LM-Zaa"/>
238 + <exclude reference="a1t-wH-dMg"/>
239 + </mask>
240 + </variation>
212 </view> 241 </view>
213 </subviews> 242 </subviews>
214 <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> 243 <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
...@@ -226,6 +255,7 @@ ...@@ -226,6 +255,7 @@
226 <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/> 255 <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
227 <constraints> 256 <constraints>
228 <constraint firstAttribute="trailing" secondItem="GDr-bX-h2w" secondAttribute="trailing" id="6Rw-Bg-NO4"/> 257 <constraint firstAttribute="trailing" secondItem="GDr-bX-h2w" secondAttribute="trailing" id="6Rw-Bg-NO4"/>
258 + <constraint firstItem="mci-HQ-9iu" firstAttribute="height" secondItem="SHO-CC-9Fd" secondAttribute="height" priority="250" id="BiG-6i-WVL"/>
229 <constraint firstItem="mci-HQ-9iu" firstAttribute="height" relation="greaterThanOrEqual" secondItem="SHO-CC-9Fd" secondAttribute="height" id="MbQ-SS-x84"/> 259 <constraint firstItem="mci-HQ-9iu" firstAttribute="height" relation="greaterThanOrEqual" secondItem="SHO-CC-9Fd" secondAttribute="height" id="MbQ-SS-x84"/>
230 <constraint firstItem="GDr-bX-h2w" firstAttribute="leading" secondItem="SHO-CC-9Fd" secondAttribute="leading" id="MlF-Ct-Ncs"/> 260 <constraint firstItem="GDr-bX-h2w" firstAttribute="leading" secondItem="SHO-CC-9Fd" secondAttribute="leading" id="MlF-Ct-Ncs"/>
231 <constraint firstAttribute="bottom" secondItem="GDr-bX-h2w" secondAttribute="bottom" id="ffd-WV-jyV"/> 261 <constraint firstAttribute="bottom" secondItem="GDr-bX-h2w" secondAttribute="bottom" id="ffd-WV-jyV"/>
......