Browse Source

hit test attempt

nayooti 4 years ago
parent
commit
4c62081f76

+ 1 - 0
deltachat-ios/Chat/ChatViewController.swift

@@ -276,6 +276,7 @@ class ChatViewController: UITableViewController {
         if RelayHelper.sharedInstance.isForwarding() {
             askToForwardMessage()
         }
+
         prepareContextMenu()
     }
 

+ 46 - 0
deltachat-ios/Controller/ContextMenuController.swift

@@ -3,9 +3,17 @@ import AVFoundation
 import SDWebImage
 import DcCore
 
+// TODO: probably not able to trigger touch events this way
+// MARK: - ContextMenuDelegate
+protocol ContextMenuDelegate: class {
+    func contextMenu(_: ContextMenuController, event: ContextMenuController.Event)
+}
+
+// MARK: - ContextMenuController
 class ContextMenuController: UIViewController {
 
     let item: GalleryItem
+    weak var delegate: ContextMenuDelegate?
 
     init(item: GalleryItem) {
         self.item = item
@@ -36,17 +44,37 @@ class ContextMenuController: UIViewController {
         guard let contentView = thumbnailView else {
             return
         }
+
+        let hitTestView = HitTestView()
+
+        view.addSubview(hitTestView)
         view.addSubview(contentView)
+        hitTestView.translatesAutoresizingMaskIntoConstraints = false
         contentView.translatesAutoresizingMaskIntoConstraints = false
 
         NSLayoutConstraint.activate([
+            hitTestView.leftAnchor.constraint(equalTo: view.leftAnchor),
+            hitTestView.rightAnchor.constraint(equalTo: view.rightAnchor),
+            hitTestView.topAnchor.constraint(equalTo: view.topAnchor),
+            hitTestView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
+
             contentView.leftAnchor.constraint(equalTo: view.leftAnchor),
             contentView.rightAnchor.constraint(equalTo: view.rightAnchor),
             contentView.topAnchor.constraint(equalTo: view.topAnchor),
             contentView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
         ])
+
+        let button = UIButton(frame: CGRect(x: view.frame.midX, y: view.frame.midY, width: 100, height: 100))
+        button.makeBorder()
+        button.setTitle("Tap me", for: .normal)
+        button.addTarget(self, action: #selector(handleThumbnailTap(_:)), for: .touchUpInside)
+        view.addSubview(button)
+//        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleThumbnailTap(_:)))
+//        contentView.addGestureRecognizer(tapGesture)
+//        contentView.makeBorder()
     }
 
+    // MARK: - thumbnailView creation
     private func makeGifView(gifImage: UIImage?) -> UIView? {
         let view = SDAnimatedImageView()
         view.contentMode = .scaleAspectFill
@@ -102,4 +130,22 @@ class ContextMenuController: UIViewController {
         let height = image.size.height * (width / image.size.width)
         self.preferredContentSize = CGSize(width: width, height: height)
     }
+
+    // MARK: - actions
+    @objc private func handleThumbnailTap(_ tapGesture: UITapGestureRecognizer) {
+        delegate?.contextMenu(self, event: .tap(item))
+    }
+
+
 }
+
+// MARK: - inner class definitions
+extension ContextMenuController {
+    enum Event {
+        case tap(GalleryItem)
+        case doupleTap(GalleryItem)
+        case longPress(GalleryItem)
+        // add event types if needed
+    }
+}
+

+ 37 - 3
deltachat-ios/Controller/GalleryViewController.swift

@@ -19,8 +19,8 @@ class GalleryViewController: UIViewController {
         return layout
     }()
 
-    private lazy var grid: UICollectionView = {
-        let collection = UICollectionView(frame: .zero, collectionViewLayout: gridLayout)
+    private lazy var grid: HitTestCollectionView = {
+        let collection = HitTestCollectionView(frame: .zero, collectionViewLayout: gridLayout)
         collection.dataSource = self
         collection.delegate = self
         collection.register(GalleryCell.self, forCellWithReuseIdentifier: GalleryCell.reuseIdentifier)
@@ -227,7 +227,9 @@ extension GalleryViewController: UICollectionViewDataSource, UICollectionViewDel
         return UIContextMenuConfiguration(
             identifier: nil,
             previewProvider: {
-               return ContextMenuController(item: item)
+                let contextMenuController = ContextMenuController(item: item)
+                contextMenuController.delegate = self
+                return contextMenuController
             },
             actionProvider: { [weak self] _ in
                 return self?.makeContextMenu(indexPath: indexPath)
@@ -301,3 +303,35 @@ extension GalleryViewController {
         present(previewController, animated: true, completion: nil)
     }
 }
+
+extension GalleryViewController: ContextMenuDelegate {
+
+    func contextMenu(_: ContextMenuController, event: ContextMenuController.Event) {
+
+        switch event {
+        case .tap(let item):
+            let msgId = item.msg.id
+            showPreview(msgId: msgId)
+        default:
+            return
+        }
+    }
+}
+
+class HitTestCollectionView: UICollectionView {
+
+    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
+        print("collection hit test succeeded")
+        return self
+    }
+
+}
+
+class HitTestView: UIView {
+
+    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
+        print("thumbnail hit test succeeded")
+        return self
+    }
+
+}