Showing
9 changed files
with
425 additions
and
4 deletions
| ... | @@ -7,7 +7,7 @@ | ... | @@ -7,7 +7,7 @@ |
| 7 | <key>Pods-SwiftWarplyFramework.xcscheme_^#shared#^_</key> | 7 | <key>Pods-SwiftWarplyFramework.xcscheme_^#shared#^_</key> |
| 8 | <dict> | 8 | <dict> |
| 9 | <key>orderHint</key> | 9 | <key>orderHint</key> |
| 10 | - <integer>1</integer> | 10 | + <integer>0</integer> |
| 11 | </dict> | 11 | </dict> |
| 12 | </dict> | 12 | </dict> |
| 13 | </dict> | 13 | </dict> | ... | ... |
| ... | @@ -7,6 +7,7 @@ | ... | @@ -7,6 +7,7 @@ |
| 7 | objects = { | 7 | objects = { |
| 8 | 8 | ||
| 9 | /* Begin PBXBuildFile section */ | 9 | /* Begin PBXBuildFile section */ |
| 10 | + 1E74838D28378AF40042A589 /* CouponBarcodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E74838C28378AF40042A589 /* CouponBarcodeViewController.swift */; }; | ||
| 10 | 1EA1AF0A2835346A008998AA /* CouponsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EA1AF092835346A008998AA /* CouponsTableViewCell.swift */; }; | 11 | 1EA1AF0A2835346A008998AA /* CouponsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EA1AF092835346A008998AA /* CouponsTableViewCell.swift */; }; |
| 11 | 7630AD9A6242D60846D6750C /* Pods_SwiftWarplyFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0D5F56DD4E5371A50AD2D87 /* Pods_SwiftWarplyFramework.framework */; }; | 12 | 7630AD9A6242D60846D6750C /* Pods_SwiftWarplyFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0D5F56DD4E5371A50AD2D87 /* Pods_SwiftWarplyFramework.framework */; }; |
| 12 | E6A77853282933340045BBA8 /* SwiftWarplyFramework.docc in Sources */ = {isa = PBXBuildFile; fileRef = E6A77852282933340045BBA8 /* SwiftWarplyFramework.docc */; }; | 13 | E6A77853282933340045BBA8 /* SwiftWarplyFramework.docc in Sources */ = {isa = PBXBuildFile; fileRef = E6A77852282933340045BBA8 /* SwiftWarplyFramework.docc */; }; |
| ... | @@ -138,6 +139,7 @@ | ... | @@ -138,6 +139,7 @@ |
| 138 | /* End PBXBuildFile section */ | 139 | /* End PBXBuildFile section */ |
| 139 | 140 | ||
| 140 | /* Begin PBXFileReference section */ | 141 | /* Begin PBXFileReference section */ |
| 142 | + 1E74838C28378AF40042A589 /* CouponBarcodeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponBarcodeViewController.swift; sourceTree = "<group>"; }; | ||
| 141 | 1EA1AF092835346A008998AA /* CouponsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponsTableViewCell.swift; sourceTree = "<group>"; }; | 143 | 1EA1AF092835346A008998AA /* CouponsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CouponsTableViewCell.swift; sourceTree = "<group>"; }; |
| 142 | A9B7BE01A4E812DE49866EF8 /* Pods-SwiftWarplyFramework.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftWarplyFramework.debug.xcconfig"; path = "Target Support Files/Pods-SwiftWarplyFramework/Pods-SwiftWarplyFramework.debug.xcconfig"; sourceTree = "<group>"; }; | 144 | A9B7BE01A4E812DE49866EF8 /* Pods-SwiftWarplyFramework.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftWarplyFramework.debug.xcconfig"; path = "Target Support Files/Pods-SwiftWarplyFramework/Pods-SwiftWarplyFramework.debug.xcconfig"; sourceTree = "<group>"; }; |
| 143 | B9EB8A451EF0C5AD75094EEE /* Pods-SwiftWarplyFramework.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftWarplyFramework.release.xcconfig"; path = "Target Support Files/Pods-SwiftWarplyFramework/Pods-SwiftWarplyFramework.release.xcconfig"; sourceTree = "<group>"; }; | 145 | B9EB8A451EF0C5AD75094EEE /* Pods-SwiftWarplyFramework.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SwiftWarplyFramework.release.xcconfig"; path = "Target Support Files/Pods-SwiftWarplyFramework/Pods-SwiftWarplyFramework.release.xcconfig"; sourceTree = "<group>"; }; |
| ... | @@ -324,6 +326,7 @@ | ... | @@ -324,6 +326,7 @@ |
| 324 | E6A7785E282933E40045BBA8 /* CouponsViewController.swift */, | 326 | E6A7785E282933E40045BBA8 /* CouponsViewController.swift */, |
| 325 | 1EA1AF092835346A008998AA /* CouponsTableViewCell.swift */, | 327 | 1EA1AF092835346A008998AA /* CouponsTableViewCell.swift */, |
| 326 | E6A7785D282933E40045BBA8 /* CouponViewController.swift */, | 328 | E6A7785D282933E40045BBA8 /* CouponViewController.swift */, |
| 329 | + 1E74838C28378AF40042A589 /* CouponBarcodeViewController.swift */, | ||
| 327 | E6A77863282933E50045BBA8 /* DetailsViewController.swift */, | 330 | E6A77863282933E50045BBA8 /* DetailsViewController.swift */, |
| 328 | E6A778DE282933E60045BBA8 /* GiftsViewController.swift */, | 331 | E6A778DE282933E60045BBA8 /* GiftsViewController.swift */, |
| 329 | E6A778DB282933E60045BBA8 /* MFYViewController.swift */, | 332 | E6A778DB282933E60045BBA8 /* MFYViewController.swift */, |
| ... | @@ -729,6 +732,7 @@ | ... | @@ -729,6 +732,7 @@ |
| 729 | E6A7791E282933E60045BBA8 /* WLSMSActionHanlder.m in Sources */, | 732 | E6A7791E282933E60045BBA8 /* WLSMSActionHanlder.m in Sources */, |
| 730 | E6A778F5282933E60045BBA8 /* WLCustomNativeAdTableViewCell.m in Sources */, | 733 | E6A778F5282933E60045BBA8 /* WLCustomNativeAdTableViewCell.m in Sources */, |
| 731 | E6A77901282933E60045BBA8 /* WLBaseItem.m in Sources */, | 734 | E6A77901282933E60045BBA8 /* WLBaseItem.m in Sources */, |
| 735 | + 1E74838D28378AF40042A589 /* CouponBarcodeViewController.swift in Sources */, | ||
| 732 | E6A778F0282933E60045BBA8 /* WLNativeAdsCollectionMode.m in Sources */, | 736 | E6A778F0282933E60045BBA8 /* WLNativeAdsCollectionMode.m in Sources */, |
| 733 | E6A7791C282933E60045BBA8 /* WLSMSActionHandlerDeprecated.m in Sources */, | 737 | E6A7791C282933E60045BBA8 /* WLSMSActionHandlerDeprecated.m in Sources */, |
| 734 | E6A77934282933E70045BBA8 /* UIActivityIndicatorView+AFNetworking.m in Sources */, | 738 | E6A77934282933E70045BBA8 /* UIActivityIndicatorView+AFNetworking.m in Sources */, | ... | ... |
| ... | @@ -7,7 +7,7 @@ | ... | @@ -7,7 +7,7 @@ |
| 7 | <key>SwiftWarplyFramework.xcscheme_^#shared#^_</key> | 7 | <key>SwiftWarplyFramework.xcscheme_^#shared#^_</key> |
| 8 | <dict> | 8 | <dict> |
| 9 | <key>orderHint</key> | 9 | <key>orderHint</key> |
| 10 | - <integer>0</integer> | 10 | + <integer>1</integer> |
| 11 | </dict> | 11 | </dict> |
| 12 | </dict> | 12 | </dict> |
| 13 | </dict> | 13 | </dict> | ... | ... |
No preview for this file type
| 1 | +// | ||
| 2 | +// CouponBarcodeViewController.swift | ||
| 3 | +// SwiftWarplyFramework | ||
| 4 | +// | ||
| 5 | +// Created by Manos Chorianopoulos on 20/5/22. | ||
| 6 | +// | ||
| 7 | + | ||
| 8 | +import UIKit | ||
| 9 | +import WarplySDKFrameworkIOS | ||
| 10 | + | ||
| 11 | +@objc class CouponBarcodeViewController: UIViewController { | ||
| 12 | + @IBOutlet weak var backgroundImage: UIImageView! | ||
| 13 | + @IBOutlet weak var scrollView: UIScrollView! | ||
| 14 | + @IBOutlet weak var scrollContentView: UIView! | ||
| 15 | + @IBOutlet weak var couponImage: UIImageView! | ||
| 16 | + @IBOutlet weak var couponImageHeight: NSLayoutConstraint! | ||
| 17 | + @IBOutlet weak var nameLabel: UILabel! | ||
| 18 | + @IBOutlet weak var discriptionLabel: UILabel! | ||
| 19 | + @IBOutlet weak var couponView: UIView! | ||
| 20 | + @IBOutlet weak var couponNumberLabel: UILabel! | ||
| 21 | + @IBOutlet weak var barcodeLabel: UILabel! | ||
| 22 | + @IBOutlet weak var expirationLabel: UILabel! | ||
| 23 | + @IBOutlet weak var redeemButton: UIButton! | ||
| 24 | + @IBOutlet weak var termsButton: UIButton! | ||
| 25 | + @IBOutlet weak var termsTextView: UITextView! | ||
| 26 | + @IBOutlet weak var termsTextViewHeight: NSLayoutConstraint! | ||
| 27 | + | ||
| 28 | + let uiscreen: CGRect = UIScreen.main.bounds | ||
| 29 | + | ||
| 30 | + var termsVisible: Bool = false; | ||
| 31 | + | ||
| 32 | + var coupon: swiftApi.CouponItemModel? | ||
| 33 | + | ||
| 34 | + override func viewDidLoad() { | ||
| 35 | + super.viewDidLoad() | ||
| 36 | + | ||
| 37 | + // Do any additional setup after loading the view. | ||
| 38 | + setBackButton() | ||
| 39 | + setNavigationTitle("Εκπτωτικό κουπόνι") | ||
| 40 | + | ||
| 41 | + backgroundImage.image = UIImage(named: "coupons_scrollview_white") | ||
| 42 | + | ||
| 43 | + scrollView.clipsToBounds = true | ||
| 44 | + scrollView.layer.cornerRadius = 30 | ||
| 45 | + scrollView.layer.maskedCorners = [ .layerMinXMinYCorner] // Top left corner radius | ||
| 46 | + | ||
| 47 | + // COUPONSET: desc, img_preview, name, terms | ||
| 48 | + // COUPON: coupon, expiration, discount, status | ||
| 49 | + | ||
| 50 | + let couponSetData: swiftApi.CouponSetItemModel? = coupon?.couponset_data | ||
| 51 | + | ||
| 52 | + couponImage.load(link: couponSetData?.img_preview ?? "", placeholder: UIImage(), cache: URLCache()) | ||
| 53 | + couponImage.contentMode = .scaleAspectFill | ||
| 54 | + couponImageHeight.constant = self.uiscreen.height * 0.25 | ||
| 55 | + | ||
| 56 | + nameLabel.text = couponSetData?.name ?? "" | ||
| 57 | + discriptionLabel.text = couponSetData?.short_description ?? "" | ||
| 58 | + | ||
| 59 | + couponView.layer.cornerRadius = 10 | ||
| 60 | + couponNumberLabel.text = coupon?.coupon ?? "" | ||
| 61 | + | ||
| 62 | + let barcodeString = constructBarcode() ?? "" | ||
| 63 | + barcodeLabel.text = barcodeString | ||
| 64 | + | ||
| 65 | + expirationLabel.text = "Το κουπόνι ισχύει έως " + (coupon?.expiration ?? "") | ||
| 66 | + | ||
| 67 | + redeemButton.titleLabel?.font = UIFont.systemFont(ofSize: 15, weight: .medium) | ||
| 68 | + | ||
| 69 | + termsButton.titleLabel?.font = .systemFont(ofSize: 15.0, weight: .semibold) | ||
| 70 | +// termsButton.imageView?.layer.transform = CATransform3DMakeScale(1.5, 1.5, 1.5) | ||
| 71 | + | ||
| 72 | + let htmlText = couponSetData?.terms ?? "" | ||
| 73 | + termsTextView.attributedText = htmlText.htmlToAttributedString | ||
| 74 | + termsTextView.font = UIFont.systemFont(ofSize: 14, weight: UIFont.Weight.regular) | ||
| 75 | + termsTextView.textColor = UIColor(red: 0.25, green: 0.33, blue: 0.39, alpha: 1.00) | ||
| 76 | + termsTextView.textAlignment = .center | ||
| 77 | + termsTextView.isScrollEnabled = false | ||
| 78 | + | ||
| 79 | + toggleTerms() | ||
| 80 | + | ||
| 81 | + } | ||
| 82 | + | ||
| 83 | + // MARK: - Functions | ||
| 84 | + func toggleTerms() { | ||
| 85 | + if (termsVisible) { | ||
| 86 | + termsTextView.isHidden = false | ||
| 87 | + let targetSize = CGSize(width: termsTextView.frame.width, height: CGFloat(MAXFLOAT)) | ||
| 88 | + termsTextViewHeight.constant = termsTextView.sizeThatFits(targetSize).height | ||
| 89 | + | ||
| 90 | + termsButton.setImage(UIImage(named: "ic_up_dark.png"), for: .normal) | ||
| 91 | + } else { | ||
| 92 | + termsTextView.isHidden = true | ||
| 93 | + termsTextViewHeight.constant = CGFloat(0) | ||
| 94 | + | ||
| 95 | + termsButton.setImage(UIImage(named: "ic_down_dark.png"), for: .normal) | ||
| 96 | + } | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + func constructBarcode() -> String? { | ||
| 100 | + // EAN 13 barcode construction | ||
| 101 | + let couponData = coupon?.couponset_data | ||
| 102 | + let couponString = coupon?.coupon ?? "" | ||
| 103 | + | ||
| 104 | + if (!couponString.isEmpty) { | ||
| 105 | + var checkDigit = 0; | ||
| 106 | + var result = 0; | ||
| 107 | + | ||
| 108 | + var fixedCouponCode = couponString; | ||
| 109 | + if (fixedCouponCode.count < 12) { | ||
| 110 | + let loops = 12 - fixedCouponCode.count; | ||
| 111 | + var zerosStr = ""; | ||
| 112 | + for i in 0 ..< loops { | ||
| 113 | + zerosStr += "0" | ||
| 114 | + } | ||
| 115 | + fixedCouponCode = zerosStr + fixedCouponCode; | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + var multiplier = 3; | ||
| 119 | + for idx in (0 ... (fixedCouponCode.count - 1)).reversed() { | ||
| 120 | + let curChar = fixedCouponCode[idx]; | ||
| 121 | + result += (Int(curChar) ?? 0) * multiplier; | ||
| 122 | + multiplier = multiplier == 3 ? 1 : 3; | ||
| 123 | + } | ||
| 124 | + checkDigit = 10 - (result % 10); | ||
| 125 | + | ||
| 126 | + let barcodeStr = fixedCouponCode + String(checkDigit); | ||
| 127 | + return barcodeStr; | ||
| 128 | + } | ||
| 129 | + | ||
| 130 | + return "" | ||
| 131 | + } | ||
| 132 | + | ||
| 133 | + // MARK: - Actions | ||
| 134 | + | ||
| 135 | + @IBAction func redeemButtomAction(_ sender: Any) { | ||
| 136 | + // TODO: Add redeem action | ||
| 137 | + | ||
| 138 | + let alert = UIAlertController(title: "Το κουπόνι σου ενεργοποιήθηκε", message: "Μπορείς να το βρεις στην αρχική οθόνη της εφαρμογής και στην ενότητα ενεργά δώρα!", preferredStyle: .alert) | ||
| 139 | + alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in | ||
| 140 | + switch action.style{ | ||
| 141 | + case .default: | ||
| 142 | + print("default") | ||
| 143 | + | ||
| 144 | + case .cancel: | ||
| 145 | + print("cancel") | ||
| 146 | + | ||
| 147 | + case .destructive: | ||
| 148 | + print("destructive") | ||
| 149 | + | ||
| 150 | + } | ||
| 151 | + })) | ||
| 152 | + self.present(alert, animated: true, completion: nil) | ||
| 153 | + } | ||
| 154 | + | ||
| 155 | + @IBAction func termsButtonAction(_ sender: Any) { | ||
| 156 | + termsVisible = !termsVisible | ||
| 157 | + toggleTerms() | ||
| 158 | + } | ||
| 159 | +} |
| ... | @@ -7,7 +7,7 @@ | ... | @@ -7,7 +7,7 @@ |
| 7 | 7 | ||
| 8 | import UIKit | 8 | import UIKit |
| 9 | 9 | ||
| 10 | -class CouponViewController: UIViewController { | 10 | +@objc class CouponViewController: UIViewController { |
| 11 | @IBOutlet weak var mainView: UIView! | 11 | @IBOutlet weak var mainView: UIView! |
| 12 | @IBOutlet weak var backgroundImage: UIImageView! | 12 | @IBOutlet weak var backgroundImage: UIImageView! |
| 13 | @IBOutlet weak var scrollView: UIScrollView! | 13 | @IBOutlet weak var scrollView: UIScrollView! | ... | ... |
| ... | @@ -9,7 +9,7 @@ import Foundation | ... | @@ -9,7 +9,7 @@ import Foundation |
| 9 | import UIKit | 9 | import UIKit |
| 10 | import WarplySDKFrameworkIOS | 10 | import WarplySDKFrameworkIOS |
| 11 | 11 | ||
| 12 | -class CouponsTableViewCell: UITableViewCell { | 12 | +@objc class CouponsTableViewCell: UITableViewCell { |
| 13 | @IBOutlet weak var couponBgImage: UIImageView! | 13 | @IBOutlet weak var couponBgImage: UIImageView! |
| 14 | @IBOutlet weak var couponImage: UIImageView! | 14 | @IBOutlet weak var couponImage: UIImageView! |
| 15 | @IBOutlet weak var borderView: UIView! | 15 | @IBOutlet weak var borderView: UIView! | ... | ... |
| ... | @@ -315,6 +315,237 @@ | ... | @@ -315,6 +315,237 @@ |
| 315 | </objects> | 315 | </objects> |
| 316 | <point key="canvasLocation" x="1612" y="129"/> | 316 | <point key="canvasLocation" x="1612" y="129"/> |
| 317 | </scene> | 317 | </scene> |
| 318 | + <!--Coupon Barcode View Controller--> | ||
| 319 | + <scene sceneID="7Dn-sf-iEB"> | ||
| 320 | + <objects> | ||
| 321 | + <viewController storyboardIdentifier="CouponBarcodeViewController" id="CDt-eI-msA" customClass="CouponBarcodeViewController" customModule="SwiftWarplyFramework" customModuleProvider="target" sceneMemberID="viewController"> | ||
| 322 | + <view key="view" contentMode="scaleToFill" id="p8P-DP-0kH"> | ||
| 323 | + <rect key="frame" x="0.0" y="0.0" width="414" height="896"/> | ||
| 324 | + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||
| 325 | + <subviews> | ||
| 326 | + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="P3Q-nP-aSj" userLabel="Main View"> | ||
| 327 | + <rect key="frame" x="0.0" y="44" width="414" height="852"/> | ||
| 328 | + <subviews> | ||
| 329 | + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="coupons_scrollview_white" translatesAutoresizingMaskIntoConstraints="NO" id="B6L-Zs-Vnz"> | ||
| 330 | + <rect key="frame" x="0.0" y="0.0" width="414" height="852"/> | ||
| 331 | + </imageView> | ||
| 332 | + <scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" ambiguous="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="D1m-2B-ehg"> | ||
| 333 | + <rect key="frame" x="0.0" y="5" width="414" height="847"/> | ||
| 334 | + <subviews> | ||
| 335 | + <view contentMode="scaleToFill" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1ec-eH-fkX"> | ||
| 336 | + <rect key="frame" x="0.0" y="0.0" width="414" height="852"/> | ||
| 337 | + <subviews> | ||
| 338 | + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="iiM-5P-m5s"> | ||
| 339 | + <rect key="frame" x="0.0" y="0.0" width="414" height="200"/> | ||
| 340 | + <constraints> | ||
| 341 | + <constraint firstAttribute="height" constant="200" id="kL0-u7-VI9"/> | ||
| 342 | + </constraints> | ||
| 343 | + </imageView> | ||
| 344 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Πάρε δωρεάν μηνιαία πακέτα με πάνες στα supermarket Σκλαβενίτης!" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Xz4-EE-EzJ"> | ||
| 345 | + <rect key="frame" x="20" y="230" width="374" height="38.5"/> | ||
| 346 | + <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/> | ||
| 347 | + <color key="textColor" red="0.25490196079999999" green="0.33333333329999998" blue="0.3921568627" alpha="0.84705882349999995" colorSpace="calibratedRGB"/> | ||
| 348 | + <nil key="highlightedColor"/> | ||
| 349 | + </label> | ||
| 350 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Χρησιμοποίησε τον παρακάτω κωδικό και πάρε δωρεάν πακέτο πάνες Pampers αποκλειστικά στα Supermarket Σκλαβενίτης" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mri-Wl-spg"> | ||
| 351 | + <rect key="frame" x="20" y="293.5" width="374" height="57.5"/> | ||
| 352 | + <fontDescription key="fontDescription" type="system" pointSize="16"/> | ||
| 353 | + <color key="textColor" red="0.25490196079999999" green="0.33333333329999998" blue="0.3921568627" alpha="0.84705882349999995" colorSpace="calibratedRGB"/> | ||
| 354 | + <nil key="highlightedColor"/> | ||
| 355 | + </label> | ||
| 356 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Κωδικός Κουπονιού" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Sg1-QU-FY1"> | ||
| 357 | + <rect key="frame" x="20" y="386" width="374" height="19.5"/> | ||
| 358 | + <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/> | ||
| 359 | + <color key="textColor" red="0.25490196079999999" green="0.33333333329999998" blue="0.3921568627" alpha="0.84705882349999995" colorSpace="calibratedRGB"/> | ||
| 360 | + <nil key="highlightedColor"/> | ||
| 361 | + </label> | ||
| 362 | + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Zdf-1r-FdJ" userLabel="Coupon View"> | ||
| 363 | + <rect key="frame" x="25" y="415.5" width="364" height="55"/> | ||
| 364 | + <subviews> | ||
| 365 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="BJS-kk-CBZ"> | ||
| 366 | + <rect key="frame" x="10" y="11.5" width="344" height="32.5"/> | ||
| 367 | + <fontDescription key="fontDescription" type="boldSystem" pointSize="27"/> | ||
| 368 | + <color key="textColor" red="0.25490196078431371" green="0.33333333333333331" blue="0.39215686274509803" alpha="1" colorSpace="calibratedRGB"/> | ||
| 369 | + <nil key="highlightedColor"/> | ||
| 370 | + </label> | ||
| 371 | + </subviews> | ||
| 372 | + <color key="backgroundColor" red="0.95686274509803915" green="0.95686274509803915" blue="0.95686274509803915" alpha="1" colorSpace="calibratedRGB"/> | ||
| 373 | + <constraints> | ||
| 374 | + <constraint firstAttribute="trailing" secondItem="BJS-kk-CBZ" secondAttribute="trailing" constant="10" id="Adz-tK-JPK"/> | ||
| 375 | + <constraint firstItem="BJS-kk-CBZ" firstAttribute="centerY" secondItem="Zdf-1r-FdJ" secondAttribute="centerY" id="WUs-XT-erR"/> | ||
| 376 | + <constraint firstAttribute="height" constant="55" id="XVr-JP-U40"/> | ||
| 377 | + <constraint firstItem="BJS-kk-CBZ" firstAttribute="leading" secondItem="Zdf-1r-FdJ" secondAttribute="leading" constant="10" id="dxa-Dc-OXI"/> | ||
| 378 | + </constraints> | ||
| 379 | + </view> | ||
| 380 | + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jrM-7n-fSw" userLabel="Border View"> | ||
| 381 | + <rect key="frame" x="20" y="490.5" width="374" height="1"/> | ||
| 382 | + <color key="backgroundColor" red="0.90196078431372551" green="0.90196078431372551" blue="0.90196078431372551" alpha="1" colorSpace="calibratedRGB"/> | ||
| 383 | + <constraints> | ||
| 384 | + <constraint firstAttribute="height" constant="1" id="eF3-7T-hMu"/> | ||
| 385 | + </constraints> | ||
| 386 | + </view> | ||
| 387 | + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="8cR-Rc-YMJ"> | ||
| 388 | + <rect key="frame" x="83" y="646" width="248" height="50"/> | ||
| 389 | + <constraints> | ||
| 390 | + <constraint firstAttribute="height" constant="50" id="ccg-NP-FIH"/> | ||
| 391 | + </constraints> | ||
| 392 | + <state key="normal" title="Button"/> | ||
| 393 | + <buttonConfiguration key="configuration" style="plain" title="Κάντο δώρο!"> | ||
| 394 | + <backgroundConfiguration key="background" cornerRadius="12"> | ||
| 395 | + <color key="backgroundColor" red="0.47450980390000003" green="0.74901960779999999" blue="0.078431372550000003" alpha="0.84705882349999995" colorSpace="calibratedRGB"/> | ||
| 396 | + </backgroundConfiguration> | ||
| 397 | + <fontDescription key="titleFontDescription" type="system" weight="medium" pointSize="15"/> | ||
| 398 | + <color key="baseForegroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||
| 399 | + </buttonConfiguration> | ||
| 400 | + <connections> | ||
| 401 | + <action selector="redeemButtomAction:" destination="CDt-eI-msA" eventType="touchUpInside" id="0pY-lD-17H"/> | ||
| 402 | + </connections> | ||
| 403 | + </button> | ||
| 404 | + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="8UD-WL-JB7"> | ||
| 405 | + <rect key="frame" x="103.5" y="706" width="207" height="50"/> | ||
| 406 | + <constraints> | ||
| 407 | + <constraint firstAttribute="height" constant="50" id="xdq-YS-AL4"/> | ||
| 408 | + </constraints> | ||
| 409 | + <inset key="imageEdgeInsets" minX="5" minY="0.0" maxX="0.0" maxY="0.0"/> | ||
| 410 | + <state key="normal" title="Button"/> | ||
| 411 | + <buttonConfiguration key="configuration" style="plain" image="ic_down_dark" imagePlacement="trailing" title="Όροι χρήσης" imagePadding="5"> | ||
| 412 | + <preferredSymbolConfiguration key="preferredSymbolConfigurationForImage"/> | ||
| 413 | + <fontDescription key="titleFontDescription" type="system" weight="semibold" pointSize="15"/> | ||
| 414 | + <color key="baseForegroundColor" red="0.25490196079999999" green="0.33333333329999998" blue="0.3921568627" alpha="0.84705882349999995" colorSpace="calibratedRGB"/> | ||
| 415 | + </buttonConfiguration> | ||
| 416 | + <connections> | ||
| 417 | + <action selector="termsButtonAction:" destination="CDt-eI-msA" eventType="touchUpInside" id="zrs-az-yjI"/> | ||
| 418 | + </connections> | ||
| 419 | + </button> | ||
| 420 | + <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" editable="NO" textAlignment="center" selectable="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xjX-HZ-MpD"> | ||
| 421 | + <rect key="frame" x="20" y="766" width="374" height="0.0"/> | ||
| 422 | + <color key="backgroundColor" systemColor="systemBackgroundColor"/> | ||
| 423 | + <constraints> | ||
| 424 | + <constraint firstAttribute="height" id="3GU-tg-S3t"/> | ||
| 425 | + </constraints> | ||
| 426 | + <color key="textColor" red="0.25490196079999999" green="0.33333333329999998" blue="0.3921568627" alpha="1" colorSpace="calibratedRGB"/> | ||
| 427 | + <fontDescription key="fontDescription" type="system" pointSize="14"/> | ||
| 428 | + <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/> | ||
| 429 | + </textView> | ||
| 430 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="123456789101112" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EKv-Mx-6Yv"> | ||
| 431 | + <rect key="frame" x="20" y="511.5" width="374" height="26.5"/> | ||
| 432 | + <fontDescription key="fontDescription" type="system" pointSize="22"/> | ||
| 433 | + <color key="textColor" red="0.25490196079999999" green="0.33333333329999998" blue="0.3921568627" alpha="0.84705882349999995" colorSpace="calibratedRGB"/> | ||
| 434 | + <nil key="highlightedColor"/> | ||
| 435 | + </label> | ||
| 436 | + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6rV-2m-QMZ" userLabel="Border 2 View"> | ||
| 437 | + <rect key="frame" x="20" y="558" width="374" height="1"/> | ||
| 438 | + <color key="backgroundColor" red="0.90196078430000004" green="0.90196078430000004" blue="0.90196078430000004" alpha="1" colorSpace="calibratedRGB"/> | ||
| 439 | + <constraints> | ||
| 440 | + <constraint firstAttribute="height" constant="1" id="DVl-3B-zqo"/> | ||
| 441 | + </constraints> | ||
| 442 | + </view> | ||
| 443 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Το κουπόνι ισχύει έως 05/12/2022" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UhC-Lj-tfN"> | ||
| 444 | + <rect key="frame" x="20" y="594" width="374" height="17"/> | ||
| 445 | + <fontDescription key="fontDescription" type="system" pointSize="14"/> | ||
| 446 | + <color key="textColor" red="0.25490196079999999" green="0.33333333329999998" blue="0.3921568627" alpha="0.84705882349999995" colorSpace="calibratedRGB"/> | ||
| 447 | + <nil key="highlightedColor"/> | ||
| 448 | + </label> | ||
| 449 | + </subviews> | ||
| 450 | + <color key="backgroundColor" systemColor="systemBackgroundColor"/> | ||
| 451 | + <constraints> | ||
| 452 | + <constraint firstItem="jrM-7n-fSw" firstAttribute="leading" secondItem="1ec-eH-fkX" secondAttribute="leading" constant="20" id="0Dc-gr-Zfa"/> | ||
| 453 | + <constraint firstAttribute="trailing" secondItem="Xz4-EE-EzJ" secondAttribute="trailing" constant="20" id="5Sx-lW-x5H"/> | ||
| 454 | + <constraint firstItem="8cR-Rc-YMJ" firstAttribute="centerX" secondItem="1ec-eH-fkX" secondAttribute="centerX" id="8hP-dm-rWP"/> | ||
| 455 | + <constraint firstItem="8cR-Rc-YMJ" firstAttribute="width" secondItem="1ec-eH-fkX" secondAttribute="width" multiplier="0.6" id="8kM-Og-K54"/> | ||
| 456 | + <constraint firstItem="8UD-WL-JB7" firstAttribute="width" secondItem="1ec-eH-fkX" secondAttribute="width" multiplier="0.5" id="9Gy-bi-NXO"/> | ||
| 457 | + <constraint firstItem="mri-Wl-spg" firstAttribute="top" secondItem="Xz4-EE-EzJ" secondAttribute="bottom" constant="25" id="9W8-fX-IzR"/> | ||
| 458 | + <constraint firstItem="xjX-HZ-MpD" firstAttribute="leading" secondItem="1ec-eH-fkX" secondAttribute="leading" constant="20" id="AIW-Kf-tkQ"/> | ||
| 459 | + <constraint firstItem="jrM-7n-fSw" firstAttribute="top" secondItem="Zdf-1r-FdJ" secondAttribute="bottom" constant="20" id="G5W-a3-pag"/> | ||
| 460 | + <constraint firstItem="iiM-5P-m5s" firstAttribute="top" secondItem="1ec-eH-fkX" secondAttribute="top" id="H9I-TB-xig"/> | ||
| 461 | + <constraint firstItem="8cR-Rc-YMJ" firstAttribute="top" secondItem="UhC-Lj-tfN" secondAttribute="bottom" constant="35" id="I87-km-KEb"/> | ||
| 462 | + <constraint firstItem="Zdf-1r-FdJ" firstAttribute="top" secondItem="Sg1-QU-FY1" secondAttribute="bottom" constant="10" id="KZi-Jl-Yyz"/> | ||
| 463 | + <constraint firstItem="UhC-Lj-tfN" firstAttribute="leading" secondItem="1ec-eH-fkX" secondAttribute="leading" constant="20" id="MSg-iF-tt9"/> | ||
| 464 | + <constraint firstAttribute="trailing" secondItem="6rV-2m-QMZ" secondAttribute="trailing" constant="20" id="NGe-PV-pQl"/> | ||
| 465 | + <constraint firstAttribute="trailing" secondItem="mri-Wl-spg" secondAttribute="trailing" constant="20" id="NmE-Pu-v1S"/> | ||
| 466 | + <constraint firstAttribute="trailing" secondItem="EKv-Mx-6Yv" secondAttribute="trailing" constant="20" id="OeB-T7-87x"/> | ||
| 467 | + <constraint firstItem="8UD-WL-JB7" firstAttribute="top" secondItem="8cR-Rc-YMJ" secondAttribute="bottom" constant="10" id="Rbe-XQ-CIj"/> | ||
| 468 | + <constraint firstAttribute="trailing" secondItem="jrM-7n-fSw" secondAttribute="trailing" constant="20" id="ReY-xR-F8V"/> | ||
| 469 | + <constraint firstItem="Xz4-EE-EzJ" firstAttribute="top" secondItem="iiM-5P-m5s" secondAttribute="bottom" constant="30" id="Ryr-v8-THU"/> | ||
| 470 | + <constraint firstItem="xjX-HZ-MpD" firstAttribute="top" secondItem="8UD-WL-JB7" secondAttribute="bottom" constant="10" id="XFI-ij-KkC"/> | ||
| 471 | + <constraint firstItem="mri-Wl-spg" firstAttribute="leading" secondItem="1ec-eH-fkX" secondAttribute="leading" constant="20" id="YLo-Lg-Lda"/> | ||
| 472 | + <constraint firstItem="Zdf-1r-FdJ" firstAttribute="leading" secondItem="1ec-eH-fkX" secondAttribute="leading" constant="25" id="ZQd-cZ-JwO"/> | ||
| 473 | + <constraint firstItem="6rV-2m-QMZ" firstAttribute="leading" secondItem="1ec-eH-fkX" secondAttribute="leading" constant="20" id="bcQ-yl-h1d"/> | ||
| 474 | + <constraint firstAttribute="trailing" secondItem="Zdf-1r-FdJ" secondAttribute="trailing" constant="25" id="c0p-Op-6VI"/> | ||
| 475 | + <constraint firstItem="Sg1-QU-FY1" firstAttribute="top" secondItem="mri-Wl-spg" secondAttribute="bottom" constant="35" id="dOs-ap-XJ4"/> | ||
| 476 | + <constraint firstItem="iiM-5P-m5s" firstAttribute="leading" secondItem="1ec-eH-fkX" secondAttribute="leading" id="e6i-V3-Csq"/> | ||
| 477 | + <constraint firstItem="8UD-WL-JB7" firstAttribute="centerX" secondItem="1ec-eH-fkX" secondAttribute="centerX" id="eFM-ex-Dye"/> | ||
| 478 | + <constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="8UD-WL-JB7" secondAttribute="bottom" constant="30" id="emI-WB-sXK"/> | ||
| 479 | + <constraint firstItem="6rV-2m-QMZ" firstAttribute="top" secondItem="EKv-Mx-6Yv" secondAttribute="bottom" constant="20" id="hL4-rX-9aa"/> | ||
| 480 | + <constraint firstItem="Sg1-QU-FY1" firstAttribute="leading" secondItem="1ec-eH-fkX" secondAttribute="leading" constant="20" id="hUh-Q7-uqi"/> | ||
| 481 | + <constraint firstItem="EKv-Mx-6Yv" firstAttribute="top" secondItem="jrM-7n-fSw" secondAttribute="bottom" constant="20" id="hZO-Qg-tda"/> | ||
| 482 | + <constraint firstItem="EKv-Mx-6Yv" firstAttribute="leading" secondItem="1ec-eH-fkX" secondAttribute="leading" constant="20" id="hf5-qR-yc9"/> | ||
| 483 | + <constraint firstAttribute="trailing" secondItem="Sg1-QU-FY1" secondAttribute="trailing" constant="20" id="j1h-uw-6rC"/> | ||
| 484 | + <constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="xjX-HZ-MpD" secondAttribute="bottom" constant="30" id="kLr-ZV-vCo"/> | ||
| 485 | + <constraint firstAttribute="trailing" secondItem="UhC-Lj-tfN" secondAttribute="trailing" constant="20" id="lM1-ep-Zec"/> | ||
| 486 | + <constraint firstItem="Xz4-EE-EzJ" firstAttribute="leading" secondItem="1ec-eH-fkX" secondAttribute="leading" constant="20" id="lMf-pF-Bp6"/> | ||
| 487 | + <constraint firstItem="UhC-Lj-tfN" firstAttribute="top" secondItem="6rV-2m-QMZ" secondAttribute="bottom" constant="35" id="ora-fw-TKe"/> | ||
| 488 | + <constraint firstAttribute="trailing" secondItem="iiM-5P-m5s" secondAttribute="trailing" id="qWA-17-dEY"/> | ||
| 489 | + <constraint firstAttribute="trailing" secondItem="xjX-HZ-MpD" secondAttribute="trailing" constant="20" id="rIc-bw-vfp"/> | ||
| 490 | + </constraints> | ||
| 491 | + </view> | ||
| 492 | + </subviews> | ||
| 493 | + <constraints> | ||
| 494 | + <constraint firstItem="1ec-eH-fkX" firstAttribute="bottom" secondItem="4fu-Tq-CEO" secondAttribute="bottom" id="7sQ-jj-vME"/> | ||
| 495 | + <constraint firstItem="1ec-eH-fkX" firstAttribute="trailing" secondItem="4fu-Tq-CEO" secondAttribute="trailing" id="Ec4-LO-JCy"/> | ||
| 496 | + <constraint firstItem="1ec-eH-fkX" firstAttribute="top" secondItem="4fu-Tq-CEO" secondAttribute="top" id="VHa-ah-QOg"/> | ||
| 497 | + <constraint firstItem="1ec-eH-fkX" firstAttribute="leading" secondItem="4fu-Tq-CEO" secondAttribute="leading" id="YB3-J0-DrC"/> | ||
| 498 | + <constraint firstItem="1ec-eH-fkX" firstAttribute="width" secondItem="282-tV-FBh" secondAttribute="width" id="kai-Hd-WzK"/> | ||
| 499 | + </constraints> | ||
| 500 | + <viewLayoutGuide key="contentLayoutGuide" id="4fu-Tq-CEO"/> | ||
| 501 | + <viewLayoutGuide key="frameLayoutGuide" id="282-tV-FBh"/> | ||
| 502 | + </scrollView> | ||
| 503 | + </subviews> | ||
| 504 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||
| 505 | + <constraints> | ||
| 506 | + <constraint firstItem="D1m-2B-ehg" firstAttribute="leading" secondItem="P3Q-nP-aSj" secondAttribute="leading" id="AMp-IG-CcQ"/> | ||
| 507 | + <constraint firstItem="B6L-Zs-Vnz" firstAttribute="top" secondItem="P3Q-nP-aSj" secondAttribute="top" id="BfW-Mh-FDd"/> | ||
| 508 | + <constraint firstItem="1ec-eH-fkX" firstAttribute="height" relation="greaterThanOrEqual" secondItem="P3Q-nP-aSj" secondAttribute="height" id="F9b-Gx-lxj"/> | ||
| 509 | + <constraint firstAttribute="bottom" secondItem="B6L-Zs-Vnz" secondAttribute="bottom" id="OZW-L0-2gZ"/> | ||
| 510 | + <constraint firstAttribute="trailing" secondItem="D1m-2B-ehg" secondAttribute="trailing" id="OZg-9O-qKw"/> | ||
| 511 | + <constraint firstItem="D1m-2B-ehg" firstAttribute="top" secondItem="P3Q-nP-aSj" secondAttribute="top" constant="5" id="b1K-LA-UXY"/> | ||
| 512 | + <constraint firstItem="B6L-Zs-Vnz" firstAttribute="leading" secondItem="P3Q-nP-aSj" secondAttribute="leading" id="oyw-NE-7bF"/> | ||
| 513 | + <constraint firstAttribute="trailing" secondItem="B6L-Zs-Vnz" secondAttribute="trailing" id="twW-h7-cNb"/> | ||
| 514 | + <constraint firstAttribute="bottom" secondItem="D1m-2B-ehg" secondAttribute="bottom" id="vw6-dc-3pg"/> | ||
| 515 | + </constraints> | ||
| 516 | + </view> | ||
| 517 | + </subviews> | ||
| 518 | + <viewLayoutGuide key="safeArea" id="mZk-p4-W2P"/> | ||
| 519 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||
| 520 | + <constraints> | ||
| 521 | + <constraint firstAttribute="bottom" secondItem="P3Q-nP-aSj" secondAttribute="bottom" id="Crs-cf-GBJ"/> | ||
| 522 | + <constraint firstItem="P3Q-nP-aSj" firstAttribute="top" secondItem="mZk-p4-W2P" secondAttribute="top" id="mBZ-Rm-pNr"/> | ||
| 523 | + <constraint firstAttribute="trailing" secondItem="P3Q-nP-aSj" secondAttribute="trailing" id="vm4-E2-JYa"/> | ||
| 524 | + <constraint firstItem="P3Q-nP-aSj" firstAttribute="leading" secondItem="p8P-DP-0kH" secondAttribute="leading" id="vy0-c0-0FN"/> | ||
| 525 | + </constraints> | ||
| 526 | + </view> | ||
| 527 | + <connections> | ||
| 528 | + <outlet property="backgroundImage" destination="B6L-Zs-Vnz" id="0fs-sM-Khn"/> | ||
| 529 | + <outlet property="barcodeLabel" destination="EKv-Mx-6Yv" id="myd-id-Q29"/> | ||
| 530 | + <outlet property="couponImage" destination="iiM-5P-m5s" id="oKZ-Up-sI3"/> | ||
| 531 | + <outlet property="couponImageHeight" destination="kL0-u7-VI9" id="QJ9-gs-XUh"/> | ||
| 532 | + <outlet property="couponNumberLabel" destination="BJS-kk-CBZ" id="Sdz-3a-Jvq"/> | ||
| 533 | + <outlet property="couponView" destination="Zdf-1r-FdJ" id="OA8-73-e0p"/> | ||
| 534 | + <outlet property="discriptionLabel" destination="mri-Wl-spg" id="iuf-XL-NWH"/> | ||
| 535 | + <outlet property="expirationLabel" destination="UhC-Lj-tfN" id="9Hj-I1-nJa"/> | ||
| 536 | + <outlet property="nameLabel" destination="Xz4-EE-EzJ" id="zTY-n5-36h"/> | ||
| 537 | + <outlet property="redeemButton" destination="8cR-Rc-YMJ" id="atB-0m-8ff"/> | ||
| 538 | + <outlet property="scrollContentView" destination="1ec-eH-fkX" id="IZE-ie-TUA"/> | ||
| 539 | + <outlet property="scrollView" destination="D1m-2B-ehg" id="dwz-JJ-dht"/> | ||
| 540 | + <outlet property="termsButton" destination="8UD-WL-JB7" id="azl-dZ-6ey"/> | ||
| 541 | + <outlet property="termsTextView" destination="xjX-HZ-MpD" id="8ZQ-e0-1Ib"/> | ||
| 542 | + <outlet property="termsTextViewHeight" destination="3GU-tg-S3t" id="H3e-IQ-FGo"/> | ||
| 543 | + </connections> | ||
| 544 | + </viewController> | ||
| 545 | + <placeholder placeholderIdentifier="IBFirstResponder" id="tvH-ht-75E" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/> | ||
| 546 | + </objects> | ||
| 547 | + <point key="canvasLocation" x="2341" y="-555"/> | ||
| 548 | + </scene> | ||
| 318 | <!--Coupon View Controller--> | 549 | <!--Coupon View Controller--> |
| 319 | <scene sceneID="yGm-Im-aAN"> | 550 | <scene sceneID="yGm-Im-aAN"> |
| 320 | <objects> | 551 | <objects> | ... | ... |
| ... | @@ -64,6 +64,33 @@ extension String { | ... | @@ -64,6 +64,33 @@ extension String { |
| 64 | } | 64 | } |
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | +extension String { | ||
| 68 | + | ||
| 69 | + var length: Int { | ||
| 70 | + return count | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + subscript (i: Int) -> String { | ||
| 74 | + return self[i ..< i + 1] | ||
| 75 | + } | ||
| 76 | + | ||
| 77 | + func substring(fromIndex: Int) -> String { | ||
| 78 | + return self[min(fromIndex, length) ..< length] | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | + func substring(toIndex: Int) -> String { | ||
| 82 | + return self[0 ..< max(0, toIndex)] | ||
| 83 | + } | ||
| 84 | + | ||
| 85 | + subscript (r: Range<Int>) -> String { | ||
| 86 | + let range = Range(uncheckedBounds: (lower: max(0, min(length, r.lowerBound)), | ||
| 87 | + upper: min(length, max(0, r.upperBound)))) | ||
| 88 | + let start = index(startIndex, offsetBy: range.lowerBound) | ||
| 89 | + let end = index(start, offsetBy: range.upperBound - range.lowerBound) | ||
| 90 | + return String(self[start ..< end]) | ||
| 91 | + } | ||
| 92 | +} | ||
| 93 | + | ||
| 67 | extension UIView { | 94 | extension UIView { |
| 68 | 95 | ||
| 69 | func addDashedBorderVertical(color: UIColor, width: CGFloat, height: CGFloat) { | 96 | func addDashedBorderVertical(color: UIColor, width: CGFloat, height: CGFloat) { | ... | ... |
-
Please register or login to post a comment