我正在尝试使用touches moved方法将一个UIView - "A“(子视图)移动到另一个UIView - "B”(SuperView)中。我可以将UIView移到superview之外。我想将UIView限制在Superview范围内。有没有办法有一个通用的方法来测试子视图是否在superview的可视矩形内?
发布于 2012-08-10 15:28:57
听起来你想限制子视图(viewA)的移动,使其始终完全包含在超视图(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无关。
发布于 2012-08-10 14:06:24
使用clipsToBounds方法或CGRectContainsRect
youSuperView.clipsToBounds = YES;我想这对你会有帮助的
发布于 2017-01-14 08:17:07
我也有同样的问题,这篇文章帮了我很大的忙,所以我将分享我的答案(这似乎正好符合你的需要):
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都放在第三个视图中(这样它们的坐标系将是相同的,并且可以很好地工作)。
希望有一天能帮助到某个人:)
https://stackoverflow.com/questions/11896245
复制相似问题