我试图让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
。