草庐IT

ios - 以编程方式生成按钮,而不会在 Objective-C xcode 中重叠

coder 2024-01-19 原文

我花了几个小时试图完成我认为是一项简单的任务。我正在尝试以编程方式在我的 iPhone 屏幕上生成 10 个未旋转的方形按钮,但它们不会重叠。每当我得到我认为正确的代码时,应用程序就会挂起。到目前为止,这是我正在尝试做的事情:

首先,我有一个 while 循环,不断尝试生成按钮,直到有 10 个(因此挂起)。此循环计算随机宽度和高度以生成按钮。

然后我尝试检查该按钮是否会导致与当前放置在屏幕上的任何按钮重叠(注意:这是为了提高效率,但已经过测试)。如果按钮可能重叠,我将“继续;”,但如果不是,则生成按钮。

生成按钮后,我将不应放置其他按钮的坐标放入其特定的、基于轴的数组中,以检查前面的循环。

这是我的代码:

- (void)addNumbers{
    int width = [[UIScreen mainScreen] bounds].size.width - 70;
    int height = [[UIScreen mainScreen] bounds].size.height - 110;
    NSMutableArray* xarray = [[NSMutableArray alloc] init];
    NSMutableArray* yarray = [[NSMutableArray alloc] init];
    int buttons = 0;
    while(buttons < 10) {
        int x = 10*floor(10+arc4random_uniform(width)/10);
        int y = 10*floor(50+arc4random_uniform(height)/10);
        NSLog(@"The coords are: %i, %i",x,y);
        if([xarray containsObject:[NSNumber numberWithInt:x]] && [yarray containsObject:[NSNumber numberWithInt:y]]){
            NSLog(@"Triggered");
            continue;
        }
        [self generateButton:x :y :buttons];
        buttons++;
        for(int i = 0; i < 6; i++){
            [xarray addObject:[NSNumber numberWithInt:(x+i*10)]];
            [yarray addObject:[NSNumber numberWithInt:(y+i*10)]];
            [xarray addObject:[NSNumber numberWithInt:(x-i*10)]];
            [yarray addObject:[NSNumber numberWithInt:(y-i*10)]];
        }
    }
}

- (void)generateButton:(int)x :(int)y :(int)num{
    UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn.frame = CGRectMake(x, y, 60, 60);
    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [btn setBackgroundColor:[UIColor whiteColor]];
    btn.titleLabel.font = [UIFont fontWithName:@"Avenir" size:40.0f];
    [btn setTitle:[NSString stringWithFormat:@"%d",num] forState:UIControlStateNormal];
    [self.view addSubview:btn];
    [self.squareArray addObject:btn];
}

请帮帮我:'(

另外,我是 Objective-C 的新手(可能很明显),所以请随时评论我可以改进我的代码或效率的任何方式。

最佳答案

我会给你我会做的事。

-(BOOL)isButtonOverlapping:(NSArray *)array button:(UIButton *)btn {
    for (UIButton *btn_ in [array copy]) {
        if (CGRectIntersectsRect(btn_, btn)) return YES;
    }
    return NO;
}

-(void)addNumbers {
    int width = [[UIScreen mainScreen] bounds].size.width - 70;
    int height = [[UIScreen mainScreen] bounds].size.height - 110;

    NSMutableArray *buttonsArray = [NSMutableArray new];

    for (short button = 0; button < 10; button++) {
        UIButton *btn = [self generateButton:x :y :button];

        do {
            btn.center = CGPointMake(rand() % width, rand() % height);
        } while ([self isButtonOverlapping:buttonsArray button:btn]);

        [buttonsArray addObject:btn];
    }
}

-(UIButton *)generateButton:(int)x :(int)y :(int)num {
    UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn.frame = CGRectMake(x, y, 60, 60);
    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [btn setBackgroundColor:[UIColor whiteColor]];
    btn.titleLabel.font = [UIFont fontWithName:@"Avenir" size:40.0f];
    [btn setTitle:[NSString stringWithFormat:@"%d",num] forState:UIControlStateNormal];
    [self.view addSubview:btn];
    [self.squareArray addObject:btn];

    return btn;
}

关于ios - 以编程方式生成按钮,而不会在 Objective-C xcode 中重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23965532/

有关ios - 以编程方式生成按钮,而不会在 Objective-C xcode 中重叠的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  4. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  5. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  6. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  7. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  8. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  9. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  10. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

随机推荐