如何让 UIImageView 的边缘捕捉到屏幕的边缘(超级视图)?

Posted

技术标签:

【中文标题】如何让 UIImageView 的边缘捕捉到屏幕的边缘(超级视图)?【英文标题】:How can I get the edges of a UIImageView to snap to the edges of the screen (superview)? 【发布时间】:2016-03-04 13:16:35 【问题描述】:

我不希望任何人为我编写代码。我只是在寻找朝着框架和/或使用方法的正确方向前进。我想要做的是,在 ios Swift 中,允许用户选择一张照片并将其放在屏幕上。我已经让那部分工作了。我也有它的工作方式,您可以拖动图像来定位它,并捏合以使其更大或更小。然而,“棘手”的部分如下......当一个(或多个)边缘接近超级视图(屏幕)的框架时,我希望 ImageView 在边缘“卡入”到位。基本上,我希望图像的边缘被“磁性”吸引到屏幕边缘。我不太确定哪种方法组合最适合实现这一目标。任何建议表示赞赏。

编辑: 这是我到目前为止所拥有的......

class AdjustableImageView: UIImageView 

    var parent:ViewController!

    // last location for view
    var lastSavedLocation = CGPointZero

    override init(frame: CGRect) 
        super.init(frame: frame)

        // add pan gesture to view
        let panGesture = UIPanGestureRecognizer(target: self, action: "handlePanGesture:")
        let longPressGesture = UILongPressGestureRecognizer(target: self, action: "handleLongPress:")
        let pinchGesture = UIPinchGestureRecognizer(target: self, action: "pinchRecognized:")
        self.addGestureRecognizer(panGesture)
        self.addGestureRecognizer(longPressGesture)
        self.addGestureRecognizer(pinchGesture)
        self.userInteractionEnabled = true
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    func pinchRecognized(pinch: UIPinchGestureRecognizer) 
        // change view scale based on pinch
        self.transform = CGAffineTransformScale(self.transform, pinch.scale, pinch.scale)
        pinch.scale = 1.0
    

    func handlePanGesture(gesture: UIPanGestureRecognizer) 
        // find translation in main view
        let newTranslation = gesture.translationInView(self.superview)

        // set current object to new position
        self.center = CGPointMake(self.lastSavedLocation.x + newTranslation.x , self.lastSavedLocation.y + newTranslation.y)
    

    // detect touch for the current view and change last save postion
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 

        // move touched view to front.
        self.superview?.bringSubviewToFront(self)

        self.layer.borderColor = UIColor.greenColor().CGColor
        self.layer.borderWidth = 2

        // save view location
        self.lastSavedLocation = self.center

        parent.imageSelected(self)
    

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) 
        self.layer.borderWidth = 0
    

【问题讨论】:

您是想在捏合过程中捕捉,还是只在拖动过程中捕捉? 另外,你如何控制图像视图的位置和大小?你在设置它的框架吗?你在设置它的变换吗?你在更新它的约束吗? @robmayoff 我两个都喜欢 @robmayoff 我编辑了我的问题以包含我的代码到目前为止 【参考方案1】:

听起来你想要一个热门的东西。

Hittest

所以我认为您希望使用拖放操作。一旦 hittest 触发了 Marge(5-10 或 15dp/px),您就会锁定图像 => 停止拖动并以编程方式定位视图...我没有对此进行测试,但这是我的第一种方法。

hittest subview

虽然您不想使用子视图进行测试,但使用子视图的边缘我认为这是可能的。

snapping to edge

上面的链接看起来像一个平滑的边缘剪裁。颠倒逻辑,你应该可以剪辑到边界...

【讨论】:

这里有很多很棒的东西。谢谢。我会做一些实验并报告。 期待。将来可能需要它:) 测试进行得如何?还是您找到了其他解决方案?【参考方案2】:

您可以尝试使用一种方法来检查 UIImageView 的边缘是否在父视图框架的一定距离内。

func checkEdge(view: UIImageView) 

    let left   = view.frame.minX
    let right  = view.frame.maxX
    let bottom = view.frame.maxY
    let top    = view.frame.minY

    if left <= 10 
        // Move view to left side
     else if right <= 10 
        // Move view to right side
     else if bottom <= 10 
        // Move view to bottom
     else if top <= 10 
        // Move view to top
     else 
        // Do nothing
    

让我知道这是否有效和/或您正在寻找什么!

【讨论】:

我收到此错误:二元运算符“ 好吧,让我看看周围,我会回复你

以上是关于如何让 UIImageView 的边缘捕捉到屏幕的边缘(超级视图)?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中制作一个可拖动的 UIView 捕捉到边缘

捕捉/粘性 WPF 窗口

无法让 UIImageView 调整大小以适应屏幕

使用 AutoLayout 缩放 UIImageView 以适应宽度

启动屏幕未调整横向大小

Swift - 如何让分段控制锁定在屏幕顶部