Ios 在UIView上拖动UIImageView始终将图像堆叠在UIView下

Ios 在UIView上拖动UIImageView始终将图像堆叠在UIView下,ios,uiview,swift3,uiimageview,uipangesturerecognizer,Ios,Uiview,Swift3,Uiimageview,Uipangesturerecognizer,我对iOS和swift 3编程相当陌生。目前我正在做一个小的学习项目。我有以下问题。 在我的屏幕上,我有4个UIView和4个UIImageView。该应用程序允许将图像“拖放”到其中一个UIView上。到目前为止,这种方法效果很好。我使用平移手势识别器来拖动图像。但出于某种原因,其中一个UIView似乎位于图像的前面,这意味着我可以将图像放到这个区域,但我看不到它-它是在UIView下分层的。其他三个操作正常,UIImageView分层在UIView的顶部。在视图控制器的viewDidLoad

我对iOS和swift 3编程相当陌生。目前我正在做一个小的学习项目。我有以下问题。 在我的屏幕上,我有4个UIView和4个UIImageView。该应用程序允许将图像“拖放”到其中一个UIView上。到目前为止,这种方法效果很好。我使用平移手势识别器来拖动图像。但出于某种原因,其中一个UIView似乎位于图像的前面,这意味着我可以将图像放到这个区域,但我看不到它-它是在UIView下分层的。其他三个操作正常,UIImageView分层在UIView的顶部。在视图控制器的viewDidLoad()函数中,我将UIView的背景色设置为灰色。如果我不这样做,图像甚至会显示在第四个UIView上

我已经检查了四个UIView对象之间的差异,但找不到任何差异。我还试图通过复制其他三个视图中的一个来重新创建UIView。 所以我的问题是:是否有任何属性定义UIView是在上面分层的,或者可以发送到后面以便其他对象在上面分层?或者我还缺少什么?如有任何提示,将不胜感激

我不太确定代码的哪些部分是相关的,所以我发布了一些(但仍然猜测这是UIView的一个属性…)

这是我设置UIView背景的地方

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)
    }

有两种方法可能对您有用:
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)
}
func moveLetter(发送方:UIPangestureRecognitor,dropArea:UIView,MoveDiImage:UIImageView,原始位置:CGPoint){

self.view.bringSubview(toFront:movedImage)/有两种方法可能对您有用:
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)
}
func moveLetter(发送方:UIPangestureRecognitor,dropArea:UIView,MoveDiImage:UIImageView,原始位置:CGPoint){

self.view.bringSubview(toFront:movedImage)//非常感谢您提到上述函数。不幸的是,它们似乎无法解决我的问题。我仍在使用它,并尝试提供更多细节。非常感谢您提到上述函数。不幸的是,它们似乎无法解决我的问题。我仍在使用它,并尝试提供更多细节矿石细节。