0

我有 25 个 UIControls 和 10 个 UIImageView。它看起来像这样:

在此处输入图像描述

现在图像是 UIImageVIews,网格是 UIControls。我想要的是当用户点击图像然后点击任何网格(当然是任何空白网格)时,UIImageView 将从当前的 superView 中删除并添加为所点击的空白网格的子视图。例如,如果用户先点击 A1 网格,然后点击 B2 网格,则会发生两个动作,

  1. A1 网格中的 UIImageView 被移除,
  2. UIImageView 添加到 B2 网格

这意味着当用户点击 A1 网格处的图像,然后点击 B2 网格时,输出窗口如下所示:

在此处输入图像描述

编辑

因此,一次我需要跟踪两个 UIControl:
1.首先按下哪个,以及
2.第二个按下哪个。
然后从第一个 UIControl 中删除 UIImageView 并将其添加到第二个 UIControl。我试过给 UIControls 一个标签,比如,

//....    
A1.tag = 1;
//...
-(void)a1ViewTapped:(id)sender
{
    int i = A1.tag;
    [self switch:i];
}
//...
-(void)switch:(int)_tag
{
    //....
    UIView *view = (UIView*)[self.view viewWithTag:_tag];

    [view removeFromSuperview];
    //...
}

通过这个我可以跟踪一个 UIControl,但需要跟踪其中两个。我怎样才能做到这一点,有人可以帮忙吗?

4

1 回答 1

3

UIControl继承自UIView,因此您可以UIControl通过调用向您的子视图添加addSubview:.

您可以UIImageView通过removeFromSuperview调用UIImageView

编辑:

一个非常简单的实现是创建一个包含对 selected 的引用的属性UIControl。当属性为 nil 时,您处于选择模式。在控件内部进行修饰会将对该控件的引用放入属性中。当属性不为零时,您正在寻找一个网格控件来放置图像。

您还需要一种方法来跟踪您的 UIControl 是否有一个 UIImageView 实例作为子视图。有很多方法可以做到这一点。一种方法是子类UIControl化以向它添加一个指向它包含的 UIImage 的属性。另一种方法可能是简单地检查 UIControl 的子视图以查看它是否包含有问题的图像之一。另一种方法是创建一些数据结构来跟踪图像的位置。怎么做取决于你自己,最好的方法取决于你的实现细节。

只是为了讨论,假设您设置了一个NSMutableDictionary调用imageMap,它使用 UIControls 的标签作为键并将对图像的引用设置为值。然后你可以做类似的事情:

-(void)selectGridControl:(UIView*)view
{
    if (selectedControl == nil)  // In this case nothing is selected
    {
        selectedControl = view;
    }
    else   // In this case we are moving the image to the new view
    {
        UIImageView *selectedImage = [imageMap objectForKey:selectedControl.tag];

        if (selectedImage != nil)
        {
            [selectedImage removeFromSuperview];
            [view addSubview:selectedImage];
            [imageMap removeObjectForKey:selectedControl.tag];
            [imageMap addObject:selectedImage forKey:view.tag];
            selectedControl = nil;
         }
     }

imageMap目标控件已有图像时的初始化和处理情况留给读者作为练习。

于 2012-04-09T14:43:51.850 回答