我是iOS和swift 3编程的新手。目前我正在开展一个小小的学习项目。我有以下问题。 在我的屏幕上,我有4个UIViews和4个UIImageViews。该应用程序允许将图像“拖放”到其中一个UIViews上。到目前为止,这非常有效。我使用Pan Gesture Recognisers来拖动UIImages。但由于某种原因,其中一个UIViews似乎在图像的前面,这意味着我可以将图像放到这个区域,但我看不到它 - 它在UIView下分层。其他三个表现正常,UIImageView分层在UIView之上。在视图控制器的viewDidLoad()函数中,我将UIViews的背景颜色设置为灰色。如果我不这样做,即使在第四个UIView上也会显示图像。
我已检查过四个UIView对象之间的差异,但找不到任何对象。我还尝试通过从其他三个中复制它来重新创建UIView。 所以我的问题是:是否有任何属性定义UIView分层在顶部或者可以发送回去,以便其他对象分层在它上面?或者还有什么我想念的?任何提示都将非常感激。
我不太确定代码的哪些部分是相关的,所以我发布了一些(但仍然猜测这是UIView的一个属性...)
这是我设置UIViews背景的地方
override func viewDidLoad() {
super.viewDidLoad()
lbViewTitle.text = "\(viewTitle) \(level) - \(levelPage)"
if (level==0) {
print("invalid level => EXIT")
} else {
loadData(level: level)
originalPositionLetter1 = letter1.center
originalPositionLetter2 = letter2.center
originalPositionLetter3 = letter3.center
originalPositionLetter4 = letter4.center
dropArea1.layer.backgroundColor = UIColor.lightGray.cgColor
dropArea2.layer.backgroundColor = UIColor.lightGray.cgColor
dropArea3.layer.backgroundColor = UIColor.lightGray.cgColor
dropArea4.layer.backgroundColor = UIColor.lightGray.cgColor
}
}
这是移动图像的代码:
@IBAction func hadlePan1(_ sender: UIPanGestureRecognizer) {
moveLetter(sender: sender, dropArea: dropArea4, movedImage: letter1, originalPosition: originalPositionLetter1)
}
func moveLetter(sender: UIPanGestureRecognizer, dropArea : UIView, movedImage : UIImageView, originalPosition : CGPoint) {
let translation = sender.translation(in: self.view)
if let view = sender.view {
view.center = CGPoint(x:view.center.x + translation.x,
y:view.center.y + translation.y)
if sender.state == UIGestureRecognizerState.ended {
let here = sender.location(in: self.view)
if (dropArea.frame.contains(here)) {
movedImage.center = dropArea.center
} else {
movedImage.center = originalPosition
}
}
}
sender.setTranslation(CGPoint.zero, in: self.view)
}
答案 0 :(得分:0)
有两种方法可能对您有用:UIView.sendSubview(toBack:)
和UIView.bringSubview(toFront:)
。
我认为您应该在开始拖动图片时调用bringSubview(toFront:)
:
func moveLetter(sender: UIPanGestureRecognizer, dropArea : UIView, movedImage : UIImageView, originalPosition : CGPoint) {
self.view.bringSubview(toFront: movedImage) // <--- add this line!
let translation = sender.translation(in: self.view)
if let view = sender.view {
view.center = CGPoint(x:view.center.x + translation.x,
y:view.center.y + translation.y)
if sender.state == UIGestureRecognizerState.ended {
let here = sender.location(in: self.view)
if (dropArea.frame.contains(here)) {
movedImage.center = dropArea.center
} else {
movedImage.center = originalPosition
}
}
}
sender.setTranslation(CGPoint.zero, in: self.view)
}