UIImageViews在拖放后制作自己的副本

时间:2011-08-28 20:32:05

标签: iphone ios ipad uiimageview drag

我试图让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”图像创建了另一个图块,但我无法移动它,因为它是在touchesbegan之后创建的:当然它只能在创建新图块时工作一次。

最终,我希望有一个字母图块(UIImageView)在其原始位置重新生成一个副本,这样如果我需要使用另一个相同的字母,我可以简单地拖动原来的副本“letter tile”(UIImageView)被拖放到“拼写”区域。

我将发表评论,其中包含ViewController代码的链接,而不是真的有必要。

预先感谢您提供任何帮助或指导!

2 个答案:

答案 0 :(得分:0)

执行此操作的最佳方法可能是跟踪顶视图中包含所有字母作为子视图的事件。 因此,假设您的字母都是名为“contentView”的视图的子视图。现在,如果每次事件触摸点与其中一个可拖动字母相交时返回nil,则覆盖contentView的

hitTest:withEvent:
,您将能够检测到contentView中的触摸(当然,如果不这样做)检测交集,然后调用super的hitTest,以便为其他不是字母的子视图获得正确的行为。 此时,contentView的触摸方法将管理字母复制和拖动,这是可能的,因为所有坐标都将引用此contentView。 在两种情况下,contentView的hitTest可能必须返回nil: - 触摸时,当触摸点位置与其中一个字母相交时,则设置拖动= YES - 拖动时触摸移动==是,你必须总是返回零 - 拖动时触摸结束==是,你必须总是返回零 在所有其他情况下,您必须调用super(UIView)hitTest以确保在所有其他情况下都能正确处理。

答案 1 :(得分:0)

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

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

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