限制superview中的视图

时间:2012-08-10 05:58:15

标签: iphone objective-c ipad ios

我正在尝试使用触摸移动方法在另一个UIView - “B”(SuperView)中移动UIView - “A”(子视图)。我能够将UIView移到superview之外。我想限制Superview界限内的UIView。有没有办法可以通用的方法测试子视图是否在superview的可见矩形内?

4 个答案:

答案 0 :(得分:7)

使用clipsToBounds方法或CGRectContainsRect

youSuperView.clipsToBounds = YES;

我认为这会对你有所帮助

答案 1 :(得分:6)

听起来你想要限制子视图(viewA)的移动总是被superview(viewB)完全包含。 CGRectContainsRect是正确的答案,但必须小心应用,因为在它的superview的坐标系中指定了子视图帧。

// inside touches moved, compute the newViewAFrame based on the movement
// but only assign it if it meets the containment constraint:

if (CGRectContainsRect(viewB.bounds, newViewAFrame)) {
    viewA.frame = newViewAFrame;
}

请注意,我们在检查中没有提到viewB.frame。 viewB在其父级中的位置与viewB是否包含viewA无关。

答案 2 :(得分:0)

Swift 2.2: let rect1 = CGRect(...) let rect2 = CGRect(...)

有一种方法可以检查 - CGRectContainsRect(rect1, rect2)

答案 3 :(得分:0)

我有同样的问题,这篇文章给了我很多帮助,所以我会分享我的答案(这似乎完全符合你的需要):

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        if (SuperView.frame.contains(self.frame)) {
            let oldCenter = self.center
            self.center = touch.location(in: SuperView)
            if(!SuperView.frame.contains(self.frame)) {
                self.center = oldCenter
            }
        }
    }
}

非常简单,你也可以在方法touchesMovedtouchesEnded中使用它,所以当你的UIView达到极限时它不会阻止你(这就是oldCenter存在的原因)。

正如@dahn所提到的,如果你的视图是在SuperView中,你必须小心,因为第一个的坐标将限制在第二个的帧,所以如果SuperView不是,它可能会失败全屏视图

如果全屏视图, SuperView不能成为SubView的父亲,则会导致错误。解决方案是将SuperView和SubView保持在第三个视图内(因此它们的坐标系将是相同的,它将正常工作)。

希望有一天可以帮助某人:)