在UIView上拖动UIImageView总是将图像堆叠在UIView下

时间:2017-03-15 08:14:37

标签: ios uiview swift3 uiimageview uipangesturerecognizer

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

1 个答案:

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