【问题标题】:Objective C Route/Path with array of buttons带有按钮数组的Objective C Route/Path
【发布时间】:2012-02-15 18:58:43
【问题描述】:

我几乎是 Objective C 和 iOS Dev 的新手,我需要制作一个记录“路线”或“路径”的应用程序(如点锁保护应用程序)。所以我想在拖动时按下按钮,启用所有直接邻居(右、左、上、下)。我已经开始编码,但我不知道我是否在正确的方向和我怎样才能实现拖动按下,这样用户就不必按下每个按钮,而是用手指跟踪路径强>

viewController.m

(void)viewDidLoad

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
for (int y=0; y < 9; y++) {
    for (int x = 0; x < 9; x++) {
        UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(20 + 30 * x, 20 + 30 * y, 30, 30);
        unsigned buttonNumber = y * 9 + x + 1;
        button.tag = buttonNumber;

        button.backgroundColor = [UIColor blackColor];

        [button setTitle:[NSString stringWithFormat:@"%u", buttonNumber] forState:UIControlStateNormal];
        [button setTitle:[NSString stringWithFormat:@"!"] forState:UIControlStateHighlighted];
        [button addTarget:self action:@selector(buttonPressed:) forControlEvents:(UIControlEventTouchUpInside)];
        [self.view addSubview: button];
    }
}

这段代码(改编自 Jorge 在我的另一篇文章中的代码)生成了一个带有唯一标签的 9x9 按钮网格。

以及相应的动作方法,

(void)buttonPressed:(UIButton *)button

if(first){

    for (int y=0; y < 9; y++) {
        for (int x = 0; x < 9; x++) {
            unsigned buttonNumber = y * 9 + x + 1;
            UIButton *auxButton = (UIButton *)[self.view viewWithTag:buttonNumber];

            if ((auxButton.tag != (button.tag + 1)) || (auxButton.tag != (button.tag - 1)) || (buttonNumber != (button.tag + 9)) || (buttonNumber != (button.tag - 9)) || (buttonNumber != button.tag )){

                auxButton.enabled = FALSE;

            }
        }
    }else{ 
//not implemented yet
}

我在这里所做的是:最初所有按钮都是启用的,但是当按下第一个按钮时,它将禁用所有按钮,除了直接邻居 (l,r,u,d)。

我的 if(condition) 不适用于 OR 条件 (||),所以所有按钮都被禁用,但如果我只使用一个条件,比如 if(auxButton.tag != button.tag + 1),它就可以工作.

这里可能有什么问题? 如何实现通过触摸跟踪的路径按下它经过的所有按钮?

提前致谢!

【问题讨论】:

  • 我不确定您所说的“我怎样才能实现通过触摸跟踪的路径按下它经过的所有按钮?”是什么意思?如果我下面的答案不是您想要的,您能否提供更多说明?
  • 你好,我的意思是:我能做些什么,只用一根手指按下几个按钮,按下时它会在屏幕上移动。
  • 你测试过我下面提供的解决方案吗?尝试 for 循环中的代码,以查看当您按下按钮(作为普通按钮)时是否启用/禁用了正确的按钮。如果它不起作用,请告诉我出了什么问题,也许我可以提供帮助。然后尝试通过 UIControlEventTouchDragInsideUIControlEventTouchDragEnter 或其他类似事件更改 UIControlEventTouchUpInside
  • 是的,我已经尝试过了,它按预期工作。我会将它用作我的代码的一部分。我已经尝试了不同的 UIControlEvents 并且它没有按我的预期工作,可能是因为模拟器,我会测试我想到的其他一些东西并将其发回。谢谢!

标签: objective-c ios button path grid


【解决方案1】:

要禁用除button 及其邻居之外的所有按钮,您可以执行以下操作:

for (int i = 0; i < 81; i++) {
    UIButton *other = (UIButton *)[self.view viewWithTag:i+1];
    if (other != button) {
        int deltaRow = abs((button.tag-1)%9 - (other.tag-1)%9);
        int deltaColumn = abs((button.tag-1)/9 - (other.tag-1)/9);
        other.enabled = (deltaRow == 0 && deltaColumn == 1) // same row, successive columns
                      ||(deltaRow == 1 && deltaColumn == 0) // same column, successive rows
    }
} 

如果您也想禁用按钮,请删除测试 (other != button)

还要检查是否要使用 UIControlEventTouchDragInsideUIControlEventTouchDragEnter 而不是 UIControlEventTouchUpInside。请参阅文档here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多