2

我正在尝试制作一个游戏,如果您点击某个东西,则会在您点击它的位置显示一个小的 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 个 UIImageViews 而不是在屏幕上拥有 48 个按钮?然后我想我会为每个添加一个点击手势识别器?还是我应该坚持我的旧计划并更改按钮图像?

(哦,顺便说一句,我不能让图像与用户在屏幕上触摸手指的位置完全成比例,我必须把它放在有组织的网格中,所以我必须有 48 个这样的图像。)

4

3 回答 3

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++;
    }
}

您可以看到重要的部分是为按钮设置选定的图像。这将允许您在点击按钮时显示您的自定义图像。这是我的测试的屏幕截图。如果你愿意,我可以给你项目文件。

在此处输入图像描述

于 2012-07-11T18:34:12.597 回答
1

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

(哦,顺便说一句,我不能让图像与用户在屏幕上触摸手指的位置完全成比例,我必须把它放在有组织的网格中,所以我必须有 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];
}

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

于 2012-07-11T18:40:05.327 回答
0

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

于 2012-07-11T18:11:52.853 回答