将 UIView 移动到图像上方

Posted

技术标签:

【中文标题】将 UIView 移动到图像上方【英文标题】:Moving UIView above image 【发布时间】:2018-02-05 10:01:28 【问题描述】:

我想通过触摸图像来移动 UIView。 我在UIImageView 和touchesBegan 中计算了图像的CGRecttouchesMoved 函数可以移动视图。 我在这些函数中有一个for 循环(touch in touches),在这个循环中有通过触摸移动视图的代码。 我只想在视图位于图像本身上方时才移动视图,因此我将 if 放入 for 循环中,这是下一个循环:

if imageRect.contains(selectedText.frame)

问题是当我将视图移出 imageRect 时,它卡住了。 我不能把它移回来。 我希望能够将 UIView 移动到图像的 CGRect 内,但不能移出。

编辑: selectedText 是 UIView,在 touchesBegan 函数中我创建了变量 toucheLocation(我在 touchesMoved 函数中有相同的代码,除了 var toucheLocation = location 部分)

if selectedText.frame.contains(toucheLocation)
    selectedText.center.x = selectedText.center.x + (location.x - toucheLocation.x)
    selectedText.center.y = selectedText.center.y + (location.y - toucheLocation.y)
    toucheLocation = location

编辑2:

这是代码的较大部分: (var toucheLocation = CGPoint() 部分在课程的开头)

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
    for touch in touches 
        let location = touch.location(in: imageView)
        toucheLocation = location
        if imageRect.contains(selectedText.frame)
            if selectedText.frame.contains(toucheLocation)
                selectedText.center.x = selectedText.center.x + (location.x - toucheLocation.x)
                selectedText.center.y = selectedText.center.y + (location.y - toucheLocation.y)
                toucheLocation = location
            
        
    


override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) 
    for touch in touches 
        let location = touch.location(in: imageView)
        if imageRect.contains(selectedText.frame)
            if selectedText.frame.contains(toucheLocation)
                selectedText.center.x = selectedText.center.x + (location.x - toucheLocation.x)
                selectedText.center.y = selectedText.center.y + (location.y - toucheLocation.y)
                toucheLocation = location
            
        
    

【问题讨论】:

你能告诉我touchesBegan func吗?你在这做了什么 @Dominik 你的问题下面有一个编辑按钮,用它来包含所有相关代码 @Dominik ALL 相关代码..在编辑上方有这一行if imageRect.contains(selectedText.frame),但在添加的代码中我看不到它.. 【参考方案1】:

好吧,现在当view 离开图像时,if 语句将阻止它移动。所以你必须改变它。我提出以下建议。

因此,不要使用当前的 if 分支(if imageRect.contains(selectedText.frame)),请尝试使用以下内容:

if selectedText.frame.contains(toucheLocation) 
    let proposedFrame = selectedText.frame
    proposedFrame.center.x = proposedFrame.center.x + (location.x - toucheLocation.x)
    proposedFrame.center.y = proposedFrame.center.y + (location.y - toucheLocation.y)

    if imageRect.contains(proposedFrame) 
        selectedText.frame = proposedFrame
    
    toucheLocation = location

现在它会一直尝试根据触摸计算新的帧。但是

if imageRect.contains(proposedFrame) 
    selectedText.frame = proposedFrame

将确保只有在图像内部时才会更新视图框架。

【讨论】:

感谢您的帮助,稍作调整就真的奏效了。【参考方案2】:

做这样的事情,

var imgView : UIImageView // your imageview on which you wanted to move the UIView

var viewMove : UIView // It is the view which move only over the

联系开始功能

let minX = imgView.frame.origin.x
let minY = imgView.frame.origin.y
let maxX = imgView.frame.origin.x + imgView.frame.size.width
let maxY = imgView.frame.origin.y + imgView.frame.size.height

let touchPoint : CGPoint // touch point

 if  (touchPoint.x >= minX) &&  // check left margin of View
        (touchPoint.y >= minY) &&  // check top margin of View
        (touchPoint.x + viewMove.frame.size.width <= maxX) &&  // check right margin of View
        (touchPoint.y + viewMove.frame.size.height <= maxY)   // check bottom margin of View



    /*- If any of above condition is false, it means your view is moving out of imageview boundry  else it is within imageview boundry.-*/

    // give your view new origin to move


else
    // do code to restrict you view to move out of image boundry

如果仍有不清楚的地方,请询问。

【讨论】:

以上是关于将 UIView 移动到图像上方的主要内容,如果未能解决你的问题,请参考以下文章

通过在它们上方移动另一个 UIView 来获取所有 UIViews

使用 UIPanGesture 将图像的位置存储到 Objc 中 UIView 中的新位置

iOS 如何使用 touchesMoved 移动两个图像?

移动带有子视图的 UIView

使用addSubview将UIView移动到其他UIView中

将 UIView 从一个选项卡移动到另一个选项卡