在使用手势识别器添加子视图时遇到用户界面故障
问题描述:
我正在开发一个应用程序,用户通过“卡片”进行滑动,这些卡片基本上是用API中的数据填充的UIViews。在使用手势识别器添加子视图时遇到用户界面故障
当应用第一次打开时,卡片被创建并作为子视图添加到超级视图。每次用户刷卡时,该卡都将从超级视图中移除。
当用户刷卡时,会在后台创建并缓存更多卡片。
当用户在最后一张卡片上时,我将缓存的卡片添加到当前正在显示的卡片背后的超级视图。
问题是,当卡被添加到超级视图时,我的手势识别器停止工作/毛刺(用户不能滑动)。几秒钟后,它再次开始工作,用户可以滑动。
如何阻止识别器发生故障?任何洞察力将不胜感激。
谢谢!
下面是一个创建/添加卡 //创建卡 FUNC createCards(新华美通:布尔)代码{
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")
}
}
}
继承人是添加识别代码/添加缓存
// 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]
}
答
想通了。一次加载太多的UIViews。更好和更顺利的临近者将是不断回收两个UIViews
因为事情工作(但最终)的方式,你可能意味着你已经编写了“基准线”的权利。如果您可以发布一些代码供我们查看,这将有所帮助。 – dfd
@dfd添加了代码 –