我有25个UIControl和10个UIImageView。它看起来像这样:
现在图像是UIImageVIews,网格是UIControls。我想要的是当用户点击图像然后点击任何网格(当然任何空白网格)时,UIImageView随后从当前的superView中删除并添加为空白网格的子视图。例如,如果用户首先点击A1网格然后点击B2网格,则会发生两个操作,
这意味着当用户点击A1网格处的图像然后点击B2网格时,输出窗口如下所示:
修改
因此,我需要跟踪两个UIControls:
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,但需要跟踪其中两个。 我怎样才能做到这一点,任何人都可以帮忙吗?
答案 0 :(得分:3)
UIControl
继承自UIView
,因此您可以通过调用UIControl
向您的addSubview:
添加子视图。
您可以通过UIImageView
removeFromSuperview
来移除上一个控件中的UIImageView
编辑:
一个非常简单的实现是创建一个包含对所选UIControl
的引用的属性。当属性为零时,您处于选择模式。触摸控件内部会将控件的引用放入属性中。如果属性不是nil,则表示您正在寻找用于放置图像的网格控件。
您还需要一种方法来跟踪您的UIControl是否将其中一个UIImageView实例作为子视图。有很多方法可以做到这一点。一种方法是将UIControl
子类化为它添加一个指向它包含的UIImage的属性。另一种方法可能是简单地检查UIControl的子视图,看它是否包含一个有问题的图像。另一种方法是创建一些数据结构以跟踪图像的位置。你是如何做的取决于你,最好的方法取决于你的实施细节。
仅仅为了讨论,我们假设你设置一个名为NSMutableDictionary
的{{1}},它使用你的UIControls的标签作为键,并将图像的引用设置为值。然后你可以做类似的事情:
imageMap
初始化-(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;
}
}
并处理目标控件已有图像的情况作为读者的练习。