Je développe une application dans laquelle les utilisateurs balaient des «cartes» qui sont essentiellement des UIViews contenant des données provenant d'une API. Lorsque l'application s'ouvre pour la première fois, les cartes sont créées et ajoutées en tant que sous-vues à la vue d'ensemble. Chaque fois qu'un utilisateur balaie, la carte est retirée de la vue d'ensemble. Pendant que l'utilisateur glisse, plus de cartes sont créées et mises en cache en arrière-plan. Lorsque l'utilisateur est sur la dernière carte, j'ajoute les cartes mises en cache à la superposition, derrière la carte qui est actuellement affichée. Le problème est que pendant que les cartes sont ajoutées à la présentation, mon outil de reconnaissance de gestes arrête de fonctionner/des problèmes (l'utilisateur ne peut pas balayer). Après quelques secondes, il recommence à fonctionner et l'utilisateur peut balayer.J'ai des problèmes avec le problème de l'interface utilisateur lors de l'ajout de sous-vues avec les reconnaissances de gestes
Comment empêcher le détecteur de se briser? Toute idée serait appréciée.
Merci!
Voici le code qui crée/ajoute les cartes // Création des cartes func createCards (FirstCall: Bool) {
APICall.begin() { (info) in
DispatchQueue.main.async {
for i in info {
let frontView = frontView()
let backView = backView()
// Set up front and back views
self.viewSetup(view: frontView)
self.viewSetup(view: backView)
// Set up card view
let view = cardView(frame: frame)
view.addSubview(backView)
view.addSubview(frontView)
self.viewSetup(view: view)
view.isHidden = true
// function that add recognizer
self.dragging(view: view)
// cacheCard
if !firstCall{
self.cache.add(cardView: view)
// add to view
}else{
self.view.addSubview(view)
}
}
// Reveal current card
if firstCall {
self.view.subviews.last?.isHidden = false
}
print("DONE")
}
}
}
Heres le code qui ajoutent les reconnaisseurs/ajoute cache
// dragging gesture helper
func draggig(card: view){
let gesture = UIPanGestureRecognizer(target: self, action: #selector(ViewController.wasDragged(_:)))
view.addGestureRecognizer(gesture)
view.isUserInteractionEnabled = true
}
// dragged gestrues
func wasDragged(_ gesture: UIPanGestureRecognizer){
// Only allow dragging when front is showing
if(showingFront){
// Dragging code
let helper = draggingBeganHelper(gesture: gesture)
let card:UIView = helper[0] as! UIView
var rotation:CGAffineTransform = helper[1] as! CGAffineTransform
var stretch:CGAffineTransform = helper.last as! CGAffineTransform
if gesture.state == UIGestureRecognizerState.ended {
rotation = CGAffineTransform(rotationAngle: 0)
stretch = rotation.scaledBy(x: 1, y: 1)
//Remove card from superview
card.removeFromSuperview()
// Store cards in cache
if(self.view.subviews.count == lastCardIndex + cardOffset){
createCards(false)
}
// When at the second to last card
else if self.view.subviews.count == lastCardIndex+1{
if cardCacheArray.isEmpty {
createCards(true)
}
else{
DispatchQueue.main.async {
for i in cardCacheArray{
self.view.insertSubview(i, belowSubview: self.view.subviews[lastCardIndex])
}
self.cache.empty()
}
}
}
}
}
}
func draggingBeganHelper(gesture: UIPanGestureRecognizer) -> [AnyObject]{
// Card dragging gesture setup
let translation = gesture.translation(in: self.view)
let card = gesture.view
card?.center = CGPoint(x: (card?.center.x)! + translation.x, y: (card?.center.y)! + translation.y)
let xFromCenter = (card?.center.x)! - self.view.bounds.width/2
let scale = min(100/abs(xFromCenter),1)
let rotation = CGAffineTransform(rotationAngle: xFromCenter/200)
let stretch = rotation.scaledBy(x: scale, y: scale)
card?.transform = stretch
return [card!,rotation as AnyObject,stretch as AnyObject]
}
Parce que les choses fonctionnent (mais finalement) comme vous le souhaitez, cela signifie probablement que vous avez codé la "ligne de base" à droite. Cela aiderait si vous pouviez poster du code pour que nous puissions le voir. – dfd
@dfd a ajouté le code –