UIImageViews在被拖放后复制自己



我试图让UIImageViews在被拖放后复制自己。例如:我有所有字母的UIImageViews。

我用Interface Builder把它们连接起来,它们彼此独立移动。

我从字母表中拉出一个"A"贴图(图像视图)来拼写一个单词。

目前,如果A被拉出,如果要拼写的单词中有两个"A",我没有其他"A"图像视图来使用第二个"A"。

我尝试创建另一个字母贴图:

for(UITouch *touch in [event allTouches])
    if ([touch view] == alphabetVowelA) {
        MainSpellingView *alphabetA;
        CGRect alphabetAa = CGRectMake(39, 104, 70, 70);
        alphabetA = [[MainSpellingView alloc] initWithFrame:alphabetAa];
        [alphabetA setImage:[UIImage imageNamed:@"a.png"]];
        [alphabetA setMultipleTouchEnabled:YES];
        [alphabetA setUserInteractionEnabled:YES];
        [self addSubview:alphabetA];
        CGPoint location = [touch locationInView:self];
        alphabetVowelA.center = location;
    }

我的代码:(我只有A, B和C移动)我想如果我能让前三个字母做我想做的事,我可以让他们都这样做。因此,为了使操作和阅读更容易,您将注意到,其中只有三个被设置为可以执行任何操作。

MainSpellingView.m

MainSpellingView.h

虽然这段代码确实在原始位置使用"a"图像创建了另一个tile,但我无法让它移动,因为它是在touchesbegan之后创建的:当然,它只会在创建新tile时工作一次。

最终,我想让一个字母平铺(UIImageView)在其原始位置重新生成一个副本,这样如果我需要使用另一个相同的字母,我可以简单地拖动复制,一旦原来的"字母平铺"(UIImageView)被拖拽并下拉到"拼写"区域。

我将留下一个链接到ViewController代码的评论,并不是真的有必要。

提前感谢你能给我的任何帮助或指导!

最好的方法可能是跟踪包含所有字母作为子视图的顶视图上的事件。假设你的字母都是contentView视图的子视图。现在,如果你重写contentView的

hitTest:withEvent:
,每次事件触摸点与一个可拖拽字母相交时返回nil,你将能够在contentView中检测到触摸(当然,如果你没有检测到交集,那么调用super的hitTest以便对其他非字母的子视图有正确的行为)。在这一点上,contentView的触摸功能将管理字母复制和拖动,这是可能的,因为所有坐标将被引用到这个contentView。可能contentView的hitTest在两种情况下必须返回nil:-触点降落时,当触点位置与其中一个字母相交时,则设置拖动=YES-在触摸移动时拖拽==YES你必须总是返回nil-在触摸结束时拖拽==YES你必须总是返回nil在所有其他情况下,你必须调用super的(UIView)的hitTest来确保在所有其他情况下都有正确的处理。

首先,如果您想要超过3个字母,我会尝试考虑一个通用视图(您可以将它们与tag s区分开来)并使用逻辑计算所有其他东西(坐标等)。但这还不是你的问题。

您提到您在IB中连接了alphabetView。似乎在重新创建新视图时,您省略了该步骤。也就是说,应该对你的触摸做出反应的视图是你的视图控制器类的IBOutlet

因此,一旦拖动完成,您应该将新视图分配给出口,事情应该像以前一样工作。

最新更新