10
votes

Recevoir des gestes du robinet uniquement sur une vue d'une vue

J'ai un uiImageView dans un contrôleur d'affichage. Est-il possible de faire certaines zones de la vue d'image tappable?

Exemple: j'ai une image d'une carte. Ne faites que les POI tapables. Pas l'image entière. Est-ce possible?


4 commentaires

Vous pouvez ajouter un uiview sur cette zone et donner sa couleur à ClearColor et ajouter de la raquette dessus ...


J'ai déjà essayé cette méthode :) Le problème est que si je zoomez sur l'image, la vue reste le même endroit pendant que l'image redimensionne. Un autre problème que j'ai rencontré de cette façon est si j'ai une image plus grande dans un défilement, si je mets un uiview en haut du uiscrollview , le défilement arrêtera de fonctionner.


Vous pouvez calculer le cadre de cette vue après zoomé dans ou out ... Hauteur et largeur multiples par balance de zoom .. Vous devrez faire des logis ici :)


Tapez sur une partie de la vue


4 Réponses :


2
votes

Oui, c'est possible, mais vous devriez vous demander si cela en vaut la peine ou non. Si c'était moi, j'ajouterais un objet de point d'intérêt sur la carte et je joindre un reconnaissance de geste à que à la place. Toutefois, si vous souhaitez aller dans l'autre itinéraire, vous pouvez examiner la méthode suivante de uigestureecognizerDelegate xxx

Cela dira si le geste devrait ou non traiter une touche donnée. . Vous pouvez le filtrer en fonction de votre POI.


0 commentaires

18
votes

Vous pouvez utiliser la méthode forte> manipulation forte>. Tout d'abord, vous devez créer un emplacement pour recevoir les touches et vous devez la comparer avec un emplacement tactile dans la méthode de déléguée, ci-dessous: xxx pré>

dans la vue ViewDiDload P>

- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer {
    CGPoint p = [gestureRecognizer locationInView:self.view];
    if (CGRectContainsPoint(locationRect, p)) {
        NSLog(@"it's inside");
    } else {
        NSLog(@"it's outside");
    }
}


1 commentaires

Cette réponse est si douce, j'ai maintenant du diabète.



0
votes

Ouais je peux vous aider. Récemment, j'ai essayé de créer un segmentdControl personnalisé où j'avais trois points de vue.

Pendant que je touchais la première moitié de la vue, le tapapeuture a fonctionné. Mais la moitié de la moitié de repos répond. Je l'ai vérifié et le résultat vous est utile maintenant.

Mon cadre du segment est:

segment.frame = cgrectument (0, 0, 300, 100);

et le cadre de l'UIView est:

View1 = [[[[[[[UIView Alloc] InitwithFrame: CGrectument (10, 80, 100, 40)];

Puis j'ai changé la hauteur du cadre à 200, puis cela a fonctionné:

segment.frame = cgrectument (0, 0, 300, 200);

** Donc, si vous voulez faire, appuyez sur la reconnaissance de la touche uniquement pour faire partie de votre vue, la hauteur de votre cadre thats c'est **


0 commentaires

2
votes

Merci à Manujmv, j'ai pu comprendre Swift 3 Strong> Mise en œuvre d'une zone de geste sur mesure forte>. Dans mon cas, je crée des bandes de 50 points de chaque côté de la fenêtre pour passer d'une VC à une autre. Mais il devrait être assez facile de réutiliser cela pour toute autre application:

class ViewController: UIViewController {
   ...
   var mySensitiveArea: CGRect?
   ...
   override func viewDidLoad() {
   ...
   let screenWidth = UIScreen.main.bounds.size.width
   let screenHeight = UIScreen.main.bounds.size.height
   mySensitiveArea = CGRect(0, 0, 50, screenHeight)
   let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(self.handleGesture(_:)))
   swipeGesture.direction = UISwipeGestureRecognizerDirection.right
   self.view.addGestureRecognizer(swipeGesture)
   }
}

//Function for determining when swipe gesture is in/outside of touchable area
func handleGesture(_ gestureRecognizer: UIGestureRecognizer) {
    let p = gestureRecognizer.location(in: self.view)
    if mySensitiveArea!.contains(p) {
        print("it's inside")
        showMainViewController()
    }
    else {
        print("it's outside")
    }
}

//Segue to Main VC
func showMainViewController() {
    self.performSegue(withIdentifier: "toMain", sender: self)
}


0 commentaires