草庐IT

ios - 检查 View 是否完全被其他 View 覆盖

coder 2023-07-30 原文

我有一个 UIView,我已经调整了它的层使其显示为一个圆圈。 (view.layer.cornerRadius = view.frame.size.height/2)

还有 n 个其他较小的圆圈以这种方式创建。

用户的目标是通过将较小的圆圈拖放到圆圈上来完全覆盖第一个圆圈。

如何检查大圆圈是否被完全覆盖?

我看过这个问题Determine whether UIView is covered by other views?但我不确定如何获取 View 层的UIBezierPath

感谢任何帮助,谢谢!

最佳答案

你可以用这个答案构造accumulatedPath Determine whether UIView is covered by other views?使用此方法:

+ (UIBezierPath *)bezierPathWithOvalInRect:(CGRect)rect

然后你可以枚举你查看圆圈上的一些点并询问路径:

- containsPoint:

示例代码:

- (BOOL)isCircleView:(UIView *)view coveredWith:(UIBezierPath *)path
{
    if (![path containsPoint:view.center])
        return NO;
    CGFloat r = CGRectGetWidth(view.bounds)/2;
    for (CGFloat angle = 0; angle < 360; angle += 0.5) {
        CGFloat alpha = angle/180*M_PI;
        CGFloat x = view.center.x + r*cos(alpha);
        CGFloat y = view.center.y + r*sin(alpha);
        if (![path containsPoint:CGPointMake(x,y)])
            return NO;
    }
    return YES;
}

此算法在您的圆形 View 边界和中心点上使用 720 个点。您将使用更多的点 - 您将获得更准确的结果。

但也有可能出现边界线隐藏,中心隐藏但部分可见的情况。所以我们可以在return YES;之前给这个方法再添加一个循环:

for (CGFloat x = view.center.x - r; x < view.center.x + r; x += 4)
for (CGFloat y = view.center.y - r; y < view.center.y + r; y += 4)
{
    // Comparing distance to center with radius
    if (pow(x-view.center.x,2)+pow(y-view.center.y,2) > pow(r,2))
        continue;
    if (![path containsPoint:CGPointMake(x,y)])
        return NO;
}

您还可以配置网格步骤以获得更准确的结果。

更新:

这是检查一个 UIBezierPath 是否与另一个 UIBezierPath 完全重叠的更常用方法。第三个参数将帮助您获得更准确的结果,请尝试使用 10、100 等值。

- (BOOL)isPath:(UIBezierPath *)path overlappedBy:(UIBezierPath *)superPath granularity:(NSInteger)granularity
{
    for (NSInteger i = 0; i < granularity; i++)
    for (NSInteger j = 0; j < granularity; j++)
    {
        CGFloat x = CGRectGetMinX(path.bounds) + i*CGRectGetWidth(path.bounds)/granularity;
        CGFloat y = CGRectGetMinY(path.bounds) + j*CGRectGetHeight(path.bounds)/granularity;
        if (![path containsPoint:CGPointMake(x,y)])
            continue;
        if (![superPath containsPoint:CGPointMake(x,y)])
            return NO;
    }
    return YES;
}

对于圆形情况,我建议使用第一种解决方案,对于随机形状——第二种解决方案。

关于ios - 检查 View 是否完全被其他 View 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30776375/

有关ios - 检查 View 是否完全被其他 View 覆盖的更多相关文章

  1. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  5. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  6. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  7. ruby - 完全离线安装RVM - 2

    我打算为ruby​​脚本创建一个安装程序,但我希望能够确保机器安装了RVM。有没有一种方法可以完全离线安装RVM并且不引人注目(通过不引人注目,就像创建一个可以做所有事情的脚本而不是要求用户向他们的bash_profile或bashrc添加一些东西)我不是要脚本本身,只是一个关于如何走这条路的快速指针(如果可能的话)。我们还研究了这个很有帮助的问题:RVM-isthereawayforsimpleofflineinstall?但有点误导,因为答案只向我们展示了如何离线在RVM中安装ruby。我们需要能够离线安装RVM本身,并查看脚本https://raw.github.com/wayn

  8. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  9. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  10. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

随机推荐