如何让 UIImageView 的边缘与屏幕边缘对齐(超级视图)



我不希望有人为我编写代码。我只是在寻找朝着要使用的框架和/或方法的正确方向前进。我想做的是,在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
    }
}
听起来你想要

一个热门测试的东西。

命中测试

所以我认为你想使用拖放。一旦 hittest 触发 marge(5-10 或 15dp/px),您锁定图像 =>停止拖动并以编程方式定位视图......我没有测试这个,但trhat将是我的第一个方法。

命中测试子视图

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

对齐边缘

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

您可以尝试使用一种方法来检查 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
    }
}

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

最新更新