首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制superview内的视图

限制superview内的视图
EN

Stack Overflow用户
提问于 2012-08-10 13:58:15
回答 4查看 4.3K关注 0票数 7

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-10 15:28:57

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

代码语言:javascript
复制
// 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无关。

票数 6
EN

Stack Overflow用户

发布于 2012-08-10 14:06:24

使用clipsToBounds方法或CGRectContainsRect

代码语言:javascript
复制
youSuperView.clipsToBounds = YES;

我想这对你会有帮助的

票数 6
EN

Stack Overflow用户

发布于 2017-01-14 08:17:07

我也有同样的问题,这篇文章帮了我很大的忙,所以我将分享我的答案(这似乎正好符合你的需要):

代码语言:javascript
复制
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都放在第三个视图中(这样它们的坐标系将是相同的,并且可以很好地工作)。

希望有一天能帮助到某个人:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11896245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档