Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 限制superview中的视图_Iphone_Objective C_Ipad_Ios - Fatal编程技术网

Iphone 限制superview中的视图

Iphone 限制superview中的视图,iphone,objective-c,ipad,ios,Iphone,Objective C,Ipad,Ios,我正在尝试使用touchsmoved方法将一个UIView-“a”(子视图)移动到另一个UIView-“B”(超级视图)中。我可以将UIView移到superview之外。我想将UIView限制在Superview边界内。是否有任何方法可以测试子视图是否位于superview的可见矩形内?Swift 2.2: let rect1=CGRect(…) let rect2=CGRect(…) 有一种方法可以检查此项-CGRectContainsRect(rect1,rect2)使用clipsToBo

我正在尝试使用touchsmoved方法将一个UIView-“a”(子视图)移动到另一个UIView-“B”(超级视图)中。我可以将UIView移到superview之外。我想将UIView限制在Superview边界内。是否有任何方法可以测试子视图是否位于superview的可见矩形内?

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


有一种方法可以检查此项-
CGRectContainsRect(rect1,rect2)
使用clipsToBounds方法或
CGRectContainsRect

youSuperView.clipsToBounds = YES;

我认为这将对您有所帮助

听起来您希望约束子视图(viewA)的移动,使其始终完全包含在超级视图(viewB)中。CGRectContainesRect是正确的答案,但必须小心应用,因为子视图框架是在其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无关。

我也有同样的问题,这篇文章对我帮助很大,因此我将分享我的答案(这似乎正好符合您的需要):

override func touchsbegind(touch:Set,带有事件:UIEvent?){
如果让触摸=先触摸{
if(SuperView.frame.contains(self.frame)){
让oldCenter=self.center
self.center=触摸位置(在:SuperView中)
如果(!SuperView.frame.contains(self.frame)){
self.center=oldCenter
}
}
}
}
非常简单,您也可以在方法
touchesMoved
touchesend
中使用它,因此当UIView达到极限时,它不会阻止您(这就是oldCenter存在的原因)

如@dahn所述,如果您的视图位于SuperView内,则必须小心,因为第一个视图的坐标将限制在第二个视图的帧内,,因此如果SuperView不是全屏视图,则可能会失败

如果它不是全屏视图,超级视图不能是子视图的父视图,因为它会导致错误。解决方案是将“超级视图”和“子视图”都保留在第三个视图中(这样它们的坐标系将相同,并且可以正常工作)


希望有一天能对某人有所帮助:)

对于上述情况,CGRectContainsRect总是返回false。clipToBounds是有用的,但是视图不应该被剪裁,它应该停止剪裁,在边界上。有什么办法吗?是的,但到达边界时视图停止。我无法在箱子到达边界后移动它。我正在尝试复制UIWebView的选择框(在www.google.com上选择并移动时,您会找到它)。最大化和调整盒子大小的手势令人痛苦。如果有任何控制或示例可供继续,则可能会出现一些问题。:)你找到解决方案了吗?是的,它在旧版本的iOS sdk上工作,我不知道它是否仍然是一样的,从技术上讲,它应该与公认的相同answer@LalithB你能把你的解决方案贴出来吗?
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
            }
        }
    }
}