【问题标题】:How do I detect how close UIView view is to the other UIView?如何检测 UIView 视图与其他 UIView 的接近程度?
【发布时间】:2013-10-22 23:45:30
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c uiview frame bounds


    【解决方案1】:

    要获得你正在寻找的神奇方法,你应该在 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 = [self distanceToView:otherView];
    

    或在两个视图之间,例如:

    double distance = [view1 distanceToView:view2];
    

    您还可以编写到最近边缘的距离等类别。上面的公式只是两点之间的距离,我使用了每个视图的中心。有关类别的更多信息,请参阅Apple docs

    【讨论】:

      【解决方案2】:

      手动。只要没有对视图应用变换,编写一些代码来计算两个视图的框架矩形之间的距离应该不难。

      在这里大声思考:

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

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

      【讨论】:

        【解决方案3】:

        必须手动完成。

        - (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() 可以帮到你很多。

        【讨论】:

        • 这不对。为什么要通过视图上边缘差异的力量来提高视图左边缘的差异?
        • 伊戈尔,即使这种方法也不正确。您总是在计算两个框架左边缘之间的距离,以及两个框架顶部之间的距离。问题比这更复杂。如果 2 帧在一维中重叠,则答案将是仅一维中近边缘之间的线性距离。只有当两个视图之间在两个维度上都有空白时,您才需要计算勾股距离,然后您需要找出最近的角。有关如何解决问题的粗略概述,请参阅我的帖子。
        猜你喜欢
        • 2011-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 2016-12-17
        相关资源
        最近更新 更多