在Xcode中使用tap功能制作图像的最佳方法?

时间:2012-07-11 17:44:49

标签: objective-c xcode uiimage uibutton

我正在尝试制作一个游戏,如果你点击一个小的50X53图像显示你点击它的地方,我开始把50x53图像的东西作为一个按钮,当你触摸按钮时,按钮的背景变为红色(模拟图像刚刚添加到那里)所以这里我在viewController上有大约48个按钮(6X8),每当我按下其中一个按钮时,背景变为红色,确定简单,但现在我想做什么将UI设置为完全空白(您无法看到任何按钮),然后当您按下给定区域时,会在您按下的那个小空间中弹出一个图像。我想而不是做

-(IBAction)imagePressed
{
sender.background=[UIColor redColor];
}


-(IBAction)imagePressedAgain
{
sender.background=[UIColor whiteColor];
}

我打算做

之类的事情
-(IBAction)imagePressed
{
sender.image=@"whateverImage.png";
//I know this isn't the right syntax to change a buttons image (and i don't even know if i can change a buttons image) but anyways i was going to try to here
}
-(IBAction)imagePressedAgain
{
sender.image=@"imageThatIsJustAWhiteBackground";
}

所以我尝试这样做,然后想到自己,嗯,也许我不应该这样做,我应该使用一堆小UIImageViews并将它们全部放在interfaceBuilder上?喜欢而不是在屏幕上有48个按钮,我会有48个UIImageViews?然后我想我会为每个添加一个轻拍手势识别器?或者我应该坚持我的旧计划并更改按钮图像?

(o,顺便说一下,我不能让图像与用户在屏幕上触摸手指的位置成正比,我必须将它放在有组织的网格中,所以我必须有48个。)

3 个答案:

答案 0 :(得分:5)

如果你想按照你所描述的(6x8)保持类似网格的安排,你可以做如下的事情:

 NSMutableArray *buttons = [[NSMutableArray alloc] init];

// Loop through and create 48 buttons at 50 x 53
for(int i = 0; i < 48; i++)
{
    UIButton *pressMe = [UIButton buttonWithType:UIButtonTypeCustom];

    [buttons addObject:pressMe];
    pressMe.frame = CGRectMake(0, 0, 50, 53);
    // Set background image for when button is selected
    [pressMe setBackgroundImage:[UIImage imageNamed:@"selectedImage.png"] forState:UIControlStateSelected];
    // Add target to toggle selected state of button
    [pressMe addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
}

int col = 0;
int row = 0;
int maxPerRow = 6;
float spacingHorizontal = 50;
float spacingVertical = 53;

for(UIButton *view in buttons)
{
    // position buttons in 6 x 8 grid
    view.frame = CGRectMake(col * spacingHorizontal, row * spacingVertical, view.frame.size.width, view.frame.size.height);
    [self.view addSubview:view];

    if(col % maxPerRow == maxPerRow-1)
    {
        col = 0;
        row++;
    }
    else
    {
        col++;
    }
}

您可以看到重要的部分是为按钮设置所选图像。这样,您可以在点按按钮时显示自定义图像。这是我测试的屏幕上限。如果你想我可以给你项目文件。

enter image description here

答案 1 :(得分:1)

编辑:我显然没有看到原来的问题包括:

  

(o,顺便说一下,我不能让图像与用户在屏幕上触摸手指的位置成正比,我必须将它放在有组织的网格中,所以我必须有48个。)

因此,我的回答并不是提问者所要求的。 ezekielDFM回答得很好。不过,我会发布它,以防万一有人想要在用户任意触摸的位置显示图像。

原始答案

正如rdelmar所说,设置它的最好方法是使用UITapGestureRecognizer。手势识别器可以拦截其视图上的触摸事件,并为您提供有用的信息。

在视图控制器实施中,您首先要将适当的UITapGestureRecognizer附加到您的视图中:

- (id)init 
{
    UITapGestureRecognizer *tapRecognizer = 
    [[UITapGestureRecognizer alloc] initWithTarget:self 
                                            action:@selector(handleSingleTap:)];

    // The gesture recognizer requires only one finger to fire
    [tapRecognizer setNumberOfTouchesRequired:1];

    // Make recognizer cancel any touches that it recognizes, so they don't
    // "fall through" to the actual view
    [tapRecognizer setCancelsTouchesInView:YES];
    [[self view] addGestureRecognizer:tapRecognizer];
}

然后,在同一实现中的某处实现handleSingleTap:选择器。它可能看起来像这样:

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
    // Get the location of the touch
    CGPoint touchPoint = [recognizer locationOfTouch:0 inView:[self view]];

    // Init a new image, or get an image in some other way
    UIImage *myImage = [UIImage imageNamed:@"test_image.png"];

    // Create a new imageView for that image... 
    UIImageView *imageView = [[UIImageView alloc] initWithImage:myImage];
    // ... and center it at the touch location
    [imageView setCenter:touchPoint];

    // Add the new UIImageView to your view's subviews
    [[self view] addSubview:imageView];
}

这应该让你开始。如果您需要更具体的帮助,请告诉我。

答案 2 :(得分:0)

我现在不在我的电脑前面,所以我无法测试这个,但我认为最简单的方法是在你的视图中添加一个手势识别器 - 你不应该需要图像预定义的视图或按钮。当用户点击视图时,从事件中获取位置并使用该信息将图像视图放置在最靠近网格上的触摸点的位置。