我正在尝试使用触摸移动方法在另一个UIView - “B”(SuperView)中移动UIView - “A”(子视图)。我能够将UIView移到superview之外。我想限制Superview界限内的UIView。有没有办法可以通用的方法测试子视图是否在superview的可见矩形内?
答案 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
}
}
}
}
非常简单,你也可以在方法touchesMoved
和touchesEnded
中使用它,所以当你的UIView达到极限时它不会阻止你(这就是oldCenter存在的原因)。
正如@dahn所提到的,如果你的视图是在SuperView中,你必须小心,因为第一个的坐标将限制在第二个的帧,所以如果SuperView不是,它可能会失败全屏视图。
如果不全屏视图, SuperView不能成为SubView的父亲,则会导致错误。解决方案是将SuperView和SubView保持在第三个视图内(因此它们的坐标系将是相同的,它将正常工作)。
希望有一天可以帮助某人:)