防止视图重叠
Posted
技术标签:
【中文标题】防止视图重叠【英文标题】:Prevent overlap of views 【发布时间】:2016-05-23 09:33:14 【问题描述】:我的容器视图有一组子视图,以编程方式手动添加。 当用户选择一个过滤器时,我想缩放选定的视图(匹配过滤器)将它们的大小增加 1.1 并保持中心但防止重叠。 到目前为止,这是我的代码:
- (void) positionSubviewsWithoutOverlapping: (NSArray *) views
for (UIView *v in views)
CGPoint center = v.center;
v.frame = CGRectMake(v.frame.origin.x, v.frame.origin.y, v.frame.size.width*1.1, v.frame.size.height*1.1);
v.center = center;
while ([self repositionSubviews:views])
- (BOOL) repositionSubviews: (NSArray *) views
BOOL somethingChanged = FALSE;
for (UIView *v1 in views)
for (UIView *v2 in views)
if (v1 != v2)
if (CGRectIntersectsRect(v1.frame, v2.frame))
somethingChanged = TRUE;
[self preventOverlapOfView1:v1 View2:v2];
return somethingChanged;
- (void) preventOverlapOfView1: (UIView *) v1 View2: (UIView *) v2
if (CGRectGetMaxX(v1.frame) > CGRectGetMinX(v2.frame))
CGFloat diff = CGRectGetMaxX(v1.frame)-CGRectGetMinX(v2.frame);
v1.frame = CGRectMake(v1.frame.origin.x-diff, v1.frame.origin.y, v1.frame.size.width, v1.frame.size.height);
else if (CGRectGetMinX(v1.frame) < CGRectGetMaxX(v2.frame))
CGFloat diff = CGRectGetMaxX(v2.frame)-CGRectGetMinX(v1.frame);
v2.frame = CGRectMake(v2.frame.origin.x-diff, v2.frame.origin.y, v2.frame.size.width, v2.frame.size.height);
if (CGRectGetMaxY(v1.frame) > CGRectGetMinY(v2.frame))
CGFloat diff = CGRectGetMaxY(v1.frame)-CGRectGetMinY(v2.frame);
v2.frame = CGRectMake(v2.frame.origin.x, v2.frame.origin.y-diff, v2.frame.size.width, v2.frame.size.height);
else if (CGRectGetMinY(v1.frame) < CGRectGetMaxY(v2.frame))
CGFloat diff = CGRectGetMaxY(v2.frame)-CGRectGetMinY(v1.frame);
v1.frame = CGRectMake(v1.frame.origin.x, v1.frame.origin.y-diff, v1.frame.size.width, v1.frame.size.height);
问题出在- (void) preventOverlapOfView1: (UIView *) v1 View2: (UIView *) v2
,我应该使用CGRectIntersection
,但我不知道如何使用它。
有人有什么建议吗?
【问题讨论】:
【参考方案1】:作为一个稍微偏左的建议,你为什么不直接使用 UICollectionView?它专为您建议的应用程序类型而设计。您可以放大某个单元格,它会自动移动其他单元格以适应大小的变化。
如果没有,那么我建议您为此使用自动布局。这又将更好地帮助其他观点不重叠。但集合视图将是最好的选择。
【讨论】:
感谢您的回答!不幸的是,我不能使用 UICollectionView,视图是使用 SVGKit 库从基本上是 svg 文件的楼层地图加载的。我必须缩放从过滤器中选择的地图的房间。 您对 CGRectIntersectsRect 的使用对我来说看起来不错。恐怕我不确定问题是什么,祝你好运:(以上是关于防止视图重叠的主要内容,如果未能解决你的问题,请参考以下文章