gpt4 book ai didi

iphone - 如何将旋转的 UIView 保留在另一个 UIView 中? (不能使用框架)

转载 作者:搜寻专家 更新时间:2023-10-30 20:26:41 25 4
gpt4 key购买 nike

我想在另一个 View 中有一个可移动/可缩放/可旋转的 View 。内部 View 可以超出外部 View 的框架,但我想将它的一部分保留在外部 View 中,这样内部 View 就不会丢失。

我简化了这个 xcode 项目中的问题 https://github.com/nextorlg/Intersection .

如果内部 View 只是可移动和可伸缩的,问题就已经解决了,但是当内部 View 旋转时,这个解决方案并不好,因为框架包含 View 但它不是 View 本身。

对内部 View 执行的每个转换我都使用这个函数来验证新的 View 位置,如果它无效我恢复最后的转换(这是可移动 View 代码 https://github.com/nextorlg/Intersection/blob/master/intersec/MovableView.m)

-(BOOL) validInset {
CGRect outerLimit = CGRectMake(0, 0, self.superview.frame.size.width, self.superview.frame.size.height);
CGRect intersectionRect = CGRectIntersection(self.frame, outerLimit);
NSLog(@"self.frame:%f,%f,%f,%f", self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height);
NSLog(@"outer.frame:%f,%f,%f,%f", outerLimit.origin.x, outerLimit.origin.y, outerLimit.size.width, outerLimit.size.height);
NSLog(@"intersec.frame:%f,%f,%f,%f", intersectionRect.origin.x, intersectionRect.origin.y, intersectionRect.size.width, intersectionRect.size.height);
NSLog(@"========================");
if ( CGRectIsNull(intersectionRect) ||
intersectionRect.size.width < INSET ||
intersectionRect.size.height < INSET ) {
return NO;
}
else {
return YES;
}
}

问题是,当第一个旋转一些(例如 45)度并拖到角落时,我如何确定内部 View 不会丢失在外部 View 后面?

一个评论,我只想在外部 View 中保留一些像素,因为内部 View 可以比外部 View 更大(缩放)。

我建议您下载并运行该项目以更好地理解问题,仅阅读本文很难理解它。

谢谢!

最佳答案

如您所述,您的方法只有在内部 View 未旋转时才能正常工作。

我所知道的解决问题的最简单方法就是简单地测试一个 View 的中心或顶点是否在另一个 View 内。

-(BOOL) validInset {
// Get the vertices of A (outerLimit)
CGRect outerLimit = self.superview.bounds;
CGPoint pointA[] = {
CGPointMake(outerLimit.origin.x, outerLimit.origin.y ),
CGPointMake(outerLimit.size.width, outerLimit.origin.y ),
CGPointMake(outerLimit.size.width, outerLimit.size.height ),
CGPointMake(outerLimit.origin.x, outerLimit.size.height )};
// Adjust outerLimit's borders
pointA[0].x += INSET, pointA[0].y += INSET;
pointA[1].x -= INSET, pointA[1].y += INSET;
pointA[2].x -= INSET, pointA[2].y -= INSET;
pointA[3].x += INSET, pointA[3].y -= INSET;
// Get the vertices of B (innerView)
CGRect innerView = self.bounds;
CGPoint pointB[] = {
CGPointMake(innerView.origin.x, innerView.origin.y ),
CGPointMake(innerView.size.width, innerView.origin.y ),
CGPointMake(innerView.size.width, innerView.size.height ),
CGPointMake(innerView.origin.x, innerView.size.height )};
// Test if the center of B is inside A or vice versa
CGPoint center, converted;
center = CGPointMake(pointB[0].x + (pointB[1].x - pointB[0].x)/2, pointB[0].y + (pointB[2].y - pointB[0].y)/2);
if( converted = [self convertPoint:center toView:self.superview],
converted.x >= pointA[0].x &&
converted.x <= pointA[1].x &&
converted.y >= pointA[0].y &&
converted.y <= pointA[2].y ) return YES;
center = CGPointMake(pointA[0].x + (pointA[1].x - pointA[0].x)/2, pointA[0].y + (pointA[2].y - pointA[0].y)/2);
if( converted = [self convertPoint:center toView:self.superview],
converted.x >= pointA[0].x &&
converted.x <= pointA[1].x &&
converted.y >= pointA[0].y &&
converted.y <= pointA[2].y ) return YES;
// Test if vertices of B are inside A or vice versa
for (int i = 0; i < 4; i++) {
if( converted = [self convertPoint:pointB[i] toView:self.superview],
converted.x >= pointA[0].x &&
converted.x <= pointA[1].x &&
converted.y >= pointA[0].y &&
converted.y <= pointA[2].y ) return YES;
if( converted = [self.superview convertPoint:pointA[i] toView:self],
converted.x >= pointB[0].x &&
converted.x <= pointB[1].x &&
converted.y >= pointB[0].y &&
converted.y <= pointB[2].y ) return YES;
}
return NO;
}

此代码将完成处理您在示例中使用的转换的工作,但这不是通用答案。

已找到此问题的非 iphone 相关答案 here .

您还可以阅读一些关于矩形和点相交的背景 here .

编辑:

对于可以应用于 UIView 的转换,测试顶点和中心对于大多数情况就足够了。

两个众所周知的异常(exception)是:

  • 当 h1 < h2/2 且 w1/2 > w2 (或 h 2 < h1/2 和 w2/2 > w1),
  • 当 2w2 < h2/2 和 r1> w2 (或 2w1 < h1/2 和 r2> w1);

哪里:

  • r = UIView 的中心和顶点之间的距离;
  • w = UIView最短边的长度;
  • h = UIView 最长边的长度。

如果您遇到其中一种情况,您应该使用另一种方法,例如 first link 中的方法。 .

关于iphone - 如何将旋转的 UIView 保留在另一个 UIView 中? (不能使用框架),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7282128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com