Manos Chorianopoulos

Add merchant description to CouponBarcodeVC

...@@ -10,7 +10,7 @@ import UIKit ...@@ -10,7 +10,7 @@ import UIKit
10 import AVFoundation 10 import AVFoundation
11 // import SwiftEventBus 11 // import SwiftEventBus
12 12
13 -@objc public class CouponBarcodeViewController: UIViewController { 13 +@objc public class CouponBarcodeViewController: UIViewController, UITextViewDelegate {
14 @IBOutlet weak var mainView: UIView! 14 @IBOutlet weak var mainView: UIView!
15 @IBOutlet weak var backgroundImage: UIImageView! 15 @IBOutlet weak var backgroundImage: UIImageView!
16 @IBOutlet weak var scrollView: UIScrollView! 16 @IBOutlet weak var scrollView: UIScrollView!
...@@ -19,6 +19,9 @@ import AVFoundation ...@@ -19,6 +19,9 @@ import AVFoundation
19 @IBOutlet weak var couponImageHeight: NSLayoutConstraint! 19 @IBOutlet weak var couponImageHeight: NSLayoutConstraint!
20 @IBOutlet weak var nameLabel: UILabel! 20 @IBOutlet weak var nameLabel: UILabel!
21 @IBOutlet weak var discriptionLabel: UILabel! 21 @IBOutlet weak var discriptionLabel: UILabel!
22 + @IBOutlet weak var merchantDescrTextView: UnselectableTappableTextView!
23 + @IBOutlet weak var merchantDescrTextViewHeight: NSLayoutConstraint!
24 + @IBOutlet weak var merchantDescrTextViewTopSpace: NSLayoutConstraint!
22 @IBOutlet weak var couponView: UIView! 25 @IBOutlet weak var couponView: UIView!
23 @IBOutlet weak var couponNumberLabel: CopyableLabel! 26 @IBOutlet weak var couponNumberLabel: CopyableLabel!
24 @IBOutlet weak var barcodeImage: UIImageView! 27 @IBOutlet weak var barcodeImage: UIImageView!
...@@ -29,7 +32,7 @@ import AVFoundation ...@@ -29,7 +32,7 @@ import AVFoundation
29 @IBOutlet weak var expirationLabel: UILabel! 32 @IBOutlet weak var expirationLabel: UILabel!
30 @IBOutlet weak var redeemButton: UIButton! 33 @IBOutlet weak var redeemButton: UIButton!
31 @IBOutlet weak var termsButton: UIButton! 34 @IBOutlet weak var termsButton: UIButton!
32 - @IBOutlet weak var termsTextView: UITextView! 35 + @IBOutlet weak var termsTextView: UnselectableTappableTextView!
33 @IBOutlet weak var termsTextViewHeight: NSLayoutConstraint! 36 @IBOutlet weak var termsTextViewHeight: NSLayoutConstraint!
34 @IBOutlet weak var borderViewHeight: NSLayoutConstraint! 37 @IBOutlet weak var borderViewHeight: NSLayoutConstraint!
35 @IBOutlet weak var borderView2Height: NSLayoutConstraint! 38 @IBOutlet weak var borderView2Height: NSLayoutConstraint!
...@@ -60,6 +63,8 @@ import AVFoundation ...@@ -60,6 +63,8 @@ import AVFoundation
60 super.viewDidLoad() 63 super.viewDidLoad()
61 64
62 self.hidesBottomBarWhenPushed = true 65 self.hidesBottomBarWhenPushed = true
66 + merchantDescrTextView.delegate = self
67 + termsTextView.delegate = self
63 68
64 // Do any additional setup after loading the view. 69 // Do any additional setup after loading the view.
65 setBackButton() 70 setBackButton()
...@@ -101,6 +106,38 @@ import AVFoundation ...@@ -101,6 +106,38 @@ import AVFoundation
101 nameLabel.text = couponSetData?.name ?? "" 106 nameLabel.text = couponSetData?.name ?? ""
102 discriptionLabel.text = couponSetData?.short_description ?? "" 107 discriptionLabel.text = couponSetData?.short_description ?? ""
103 108
109 + merchantDescrTextView.text = ""
110 + merchantDescrTextViewTopSpace.constant = CGFloat(0)
111 + merchantDescrTextViewHeight.constant = CGFloat(0)
112 + merchantDescrTextView.isHidden = true
113 +
114 + let merchantList:Array<swiftApi.MerchantModel> = swiftApi().getMerchantList()
115 +
116 + for merchant in merchantList {
117 + if (merchant._uuid == couponSetData?.merchant_uuid) {
118 + let htmlMerchDescrText = merchant._body
119 +
120 + if (htmlMerchDescrText != "") {
121 + merchantDescrTextView.attributedText = htmlMerchDescrText.htmlToAttributedString
122 + merchantDescrTextView.font = UIFont(name: "PFSquareSansPro-Regular", size: 17)
123 + merchantDescrTextView.textColor = UIColor(red: 0.25, green: 0.33, blue: 0.39, alpha: 1.00)
124 + merchantDescrTextView.textAlignment = .center
125 + merchantDescrTextView.isScrollEnabled = false
126 + merchantDescrTextView.isUserInteractionEnabled = true
127 + merchantDescrTextView.isEditable = false
128 + merchantDescrTextView.isSelectable = true
129 + merchantDescrTextView.dataDetectorTypes = [.link]
130 +
131 + merchantDescrTextView.isHidden = false
132 + merchantDescrTextViewTopSpace.constant = CGFloat(15)
133 + let targetSize = CGSize(width: merchantDescrTextView.frame.width, height: CGFloat(MAXFLOAT))
134 + merchantDescrTextViewHeight.constant = merchantDescrTextView.sizeThatFits(targetSize).height
135 + }
136 +
137 + break;
138 + }
139 + }
140 +
104 couponView.layer.cornerRadius = 8 141 couponView.layer.cornerRadius = 8
105 couponNumberLabel.text = coupon?.coupon ?? "" 142 couponNumberLabel.text = coupon?.coupon ?? ""
106 couponView.frame = CGRect(x: 0.0, y: 0.0, width: couponView.intrinsicContentSize.width, height: 55) 143 couponView.frame = CGRect(x: 0.0, y: 0.0, width: couponView.intrinsicContentSize.width, height: 55)
...@@ -246,6 +283,11 @@ import AVFoundation ...@@ -246,6 +283,11 @@ import AVFoundation
246 termsTextView.textAlignment = .center 283 termsTextView.textAlignment = .center
247 termsTextView.isScrollEnabled = false 284 termsTextView.isScrollEnabled = false
248 285
286 + termsTextView.isUserInteractionEnabled = true
287 + termsTextView.isEditable = false
288 + termsTextView.isSelectable = true
289 + termsTextView.dataDetectorTypes = [.link]
290 +
249 // Uncomment if Barcode Section is active again 291 // Uncomment if Barcode Section is active again
250 // toggleTerms() 292 // toggleTerms()
251 toggleBarcode() 293 toggleBarcode()
...@@ -265,6 +307,14 @@ import AVFoundation ...@@ -265,6 +307,14 @@ import AVFoundation
265 307
266 } 308 }
267 309
310 + public func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
311 + UIApplication.shared.open(URL)
312 +
313 + // Disable `.preview` by 3D Touch and other interactions
314 + return false
315 + }
316 +
317 +
268 // MARK: - Functions 318 // MARK: - Functions
269 func toggleTerms() { 319 func toggleTerms() {
270 if (termsVisible) { 320 if (termsVisible) {
......
...@@ -490,3 +490,35 @@ extension UINavigationController { ...@@ -490,3 +490,35 @@ extension UINavigationController {
490 return nil 490 return nil
491 } 491 }
492 } 492 }
493 +
494 +/// Class to allow links but no selection.
495 +/// Basically, it disables unwanted UIGestureRecognizer from UITextView.
496 +class UnselectableTappableTextView: UITextView {
497 +
498 + // required to prevent blue background selection from any situation
499 + override var selectedTextRange: UITextRange? {
500 + get { return nil }
501 + set {}
502 + }
503 +
504 + override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
505 + if gestureRecognizer is UIPanGestureRecognizer {
506 + // required for compatibility with isScrollEnabled
507 + return super.gestureRecognizerShouldBegin(gestureRecognizer)
508 + }
509 + if let tapGestureRecognizer = gestureRecognizer as? UITapGestureRecognizer,
510 + tapGestureRecognizer.numberOfTapsRequired == 1 {
511 + // required for compatibility with links
512 + return super.gestureRecognizerShouldBegin(gestureRecognizer)
513 + }
514 + // allowing smallDelayRecognizer for links
515 + if let longPressGestureRecognizer = gestureRecognizer as? UILongPressGestureRecognizer,
516 + // comparison value is used to distinguish between 0.12 (smallDelayRecognizer) and 0.5 (textSelectionForce and textLoupe)
517 + longPressGestureRecognizer.minimumPressDuration < 0.325 {
518 + return super.gestureRecognizerShouldBegin(gestureRecognizer)
519 + }
520 + // preventing selection from loupe/magnifier (_UITextSelectionForceGesture), multi tap, tap and a half, etc.
521 + gestureRecognizer.isEnabled = false
522 + return false
523 + }
524 +}
......