ユーザーが基本的にUIViewに「カード」をスワイプしてAPIのデータを入力するアプリを開発しています。ジェスチャー認識ツールを使ってサブビューを追加するときにUIグリッチに問題がある
アプリが最初に開くと、カードが作成され、スーパービューにサブビューとして追加されます。ユーザーがスワイプするたびに、カードはスーパービューから削除されます。
ユーザーがスワイプしている間に、さらに多くのカードが作成され、バックグラウンドでキャッシュされます。
ユーザーが最後のカードを使用している場合、現在表示されているカードの背後にあるキャッシュされたカードをスーパービューに追加します。
カードがスーパービューに追加されている間、私のジェスチャーレコグナイザは動作/グリッチを停止します(ユーザーはスワイプできません)。数秒後に再び動作を開始し、ユーザーはスワイプできます。
どのようにして認識装置のグリッチを止めますか?どんな洞察にも感謝します。
ありがとうございました!
ここで/はカードに //カードを作成 FUNCのcreateCards(firstCall:ブール値)を追加作成するコードです相続人の認識機能を追加するコードは/キャッシュ
// 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]
}
を追加{
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")
}
}
}
は、
物事は(最終的に)あなたが望むように機能するため、おそらく "ベースライン"の権利がコーディングされたことを意味します。私たちが見るためにいくつかのコードを投稿することができれば助けになります。 – dfd
@dfdがコードを追加しました –