Ios 如何检测UIView与其他UIView的距离?

Ios 如何检测UIView与其他UIView的距离?,ios,objective-c,uiview,frame,bounds,Ios,Objective C,Uiview,Frame,Bounds,是否有一种神奇的方法可以接受两个视图并返回它们之间的距离(可能是x和y距离)?或者这是必须手动完成的吗?必须手动完成 - (double)distance:(UIView*)view1 view2:(UIView*)view2 { double dx = CGRectGetMinX(view2) - CGRectGetMinX(view1); double dy = CGRectGetMinY(view2) - CGRectGetMinY(view1);

是否有一种神奇的方法可以接受两个视图并返回它们之间的距离(可能是x和y距离)?或者这是必须手动完成的吗?

必须手动完成

- (double)distance:(UIView*)view1 view2:(UIView*)view2
{
       double dx = CGRectGetMinX(view2) - CGRectGetMinX(view1);
       double dy = CGRectGetMinY(view2) - CGRectGetMinY(view1);

       return sqrt(dx * dx + dy * dy);
       or
       return sqrt(pow(dx, 2) + pow(dy, 2));
}
CGRectGetMinX()| CGRectGetMaxX()和CGRectGetMinY()| CGRectGetMaxY()可以帮助您很多。

必须手动完成

- (double)distance:(UIView*)view1 view2:(UIView*)view2
{
       double dx = CGRectGetMinX(view2) - CGRectGetMinX(view1);
       double dy = CGRectGetMinY(view2) - CGRectGetMinY(view1);

       return sqrt(dx * dx + dy * dy);
       or
       return sqrt(pow(dx, 2) + pow(dy, 2));
}

CGRectGetMinX()| CGRectGetMaxX()和CGRectGetMinY()| CGRectGetMaxY()可以为您提供很多帮助。

手动操作。只要没有对视图应用变换,编写一些代码来计算两个视图的帧矩形之间的距离就不会那么困难

在这里大声思考:

如果无法在两个视图框矩形之间的空间中绘制垂直和水平线,则距离将为最近边之间的x距离或y距离


如果可以在视图之间绘制水平线和垂直线(它们在x维度或y维度上都不重叠),则两个视图之间的距离将是它们最近角之间的毕达哥拉斯距离。

手动。只要没有对视图应用变换,编写一些代码来计算两个视图的帧矩形之间的距离就不会那么困难

在这里大声思考:

如果无法在两个视图框矩形之间的空间中绘制垂直和水平线,则距离将为最近边之间的x距离或y距离


如果您可以在视图之间绘制水平线和垂直线(它们在x维度或y维度上都不重叠),那么这两个视图之间的距离将是它们最近角之间的毕达哥拉斯距离。

要获得您正在寻找的神奇方法,您应该在UIView上写一个类别:

// UIView+distance.h
#import <UIKit/UIKit.h>

@interface UIView (distance)
-(double)distanceToView:(UIView *)view;
@end


// UIView+distance.m
#import "UIView+distance.h"

@implementation UIView (distance)
-(double)distanceToView:(UIView *)view
{
    return sqrt(pow(view.center.x - self.center.x, 2) + pow(view.center.y - self.center.y, 2));
}
@end
或者在两个视图之间,例如:

double distance = [view1 distanceToView:view2];

你也可以为到最近边的距离等写分类。上面的公式就是两点之间的距离,我使用了每个视图的中心。有关类别的更多信息,请参见。

要获得您正在寻找的神奇方法,您应该在UIView上编写一个类别:

// UIView+distance.h
#import <UIKit/UIKit.h>

@interface UIView (distance)
-(double)distanceToView:(UIView *)view;
@end


// UIView+distance.m
#import "UIView+distance.h"

@implementation UIView (distance)
-(double)distanceToView:(UIView *)view
{
    return sqrt(pow(view.center.x - self.center.x, 2) + pow(view.center.y - self.center.y, 2));
}
@end
或者在两个视图之间,例如:

double distance = [view1 distanceToView:view2];

你也可以为到最近边的距离等写分类。上面的公式就是两点之间的距离,我使用了每个视图的中心。有关类别的更多信息,请参阅。

这不正确。为什么要通过视图上边缘的差异来提高视图左边缘的差异?Igor,即使这种方法也不正确。您总是在计算两个框架的左边缘之间的距离,以及两个框架顶部之间的距离。问题比那更复杂。如果两个帧在一个维度上重叠,则答案将是仅在一个维度上的近边之间的线性距离。只有当两个视图在两个维度上都有空白时,才需要计算毕达哥拉斯距离,然后计算最近的角点。请看我的帖子,大致了解如何解决这个问题。这是不对的。为什么要通过视图上边缘的差异来提高视图左边缘的差异?Igor,即使这种方法也不正确。您总是在计算两个框架的左边缘之间的距离,以及两个框架顶部之间的距离。问题比那更复杂。如果两个帧在一个维度上重叠,则答案将是仅在一个维度上的近边之间的线性距离。只有当两个视图在两个维度上都有空白时,才需要计算毕达哥拉斯距离,然后计算最近的角点。关于如何解决这个问题,请参阅我的帖子。