无法在touchesBegan中看到UIImageView属性

时间:2010-01-01 20:47:55

标签: iphone uiview properties uiimageview

我有一个非常简单的应用程序,而且我只是在开始时卡住了。 让我在这里发布代码。

TapStackView.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

@interface TapStackView : UIView
{
    //Layers.
    UIImageView *backgroundImageView;
    UIImageView *powerOn;
}
@property (nonatomic, retain) UIImageView *backgroundImageView;
@property (nonatomic, retain) UIImageView *powerOn;
@end

TapStackView.m

#import "TapStackView.h"

@implementation TapStackView
@synthesize backgroundImageView, powerOn;

//Initialize,
-(id)initWithFrame: (CGRect)frame
{
    if (self = [super initWithFrame:frame])
    {
        //Set up layers.
        self.backgroundImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"layout.png"]];

        self.powerOn = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"powerOn.png"]];     
        self.powerOn.center = CGPointMake(159 + powerOn.frame.size.width/2, 26 + powerOn.frame.size.height/2);

        //Attach to the view.
        [self addSubview:self.backgroundImageView];
        [self addSubview:powerOn];      

        NSLog(@"initWithFrame - powerOn.center is %f, %f", self.powerOn.center.x, self.powerOn.center.y);   

    }
    return self;
}

//Finger touched.
-(void)touchesBegan: (NSSet*)touches withEvent: (UIEvent*)event
{
    NSLog(@"-----");
    NSLog(@"touchesBegan - self.powerOn.center is %f, %f", self.powerOn.center.x, self.powerOn.center.y);   
}

@end

控制台

[Session started at 2010-01-01 21:39:42 +0100.]
2010-01-01 21:39:44.177 TapStack[6261:20b] initWithFrame - powerOn.center is 186.000000, 53.000000
2010-01-01 21:39:45.149 TapStack[6261:20b] -----
2010-01-01 21:39:45.150 TapStack[6261:20b] touchesBegan - self.powerOn.center is 0.000000, 0.000000
2010-01-01 21:39:45.978 TapStack[6261:20b] -----
2010-01-01 21:39:45.979 TapStack[6261:20b] touchesBegan - self.powerOn.center is 0.000000, 0.000000
2010-01-01 21:39:48.914 TapStack[6261:20b] -----
2010-01-01 21:39:48.915 TapStack[6261:20b] touchesBegan - self.powerOn.center is 0.000000, 0.000000
2010-01-01 21:39:50.011 TapStack[6261:20b] -----
2010-01-01 21:39:50.012 TapStack[6261:20b] touchesBegan - self.powerOn.center is 0.000000, 0.000000

我无法想象为什么我不能在touchesBegan方法中看到powerOn属性。 有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您需要在视图上设置.userInteractionEnabled:

myView.userInteractionEnabled = YES;

从文档中:默认情况下,新图像视图对象配置为忽略用户事件。如果要在UIImageView的自定义子类中处理事件,则必须在初始化对象后显式将userInteractionEnabled属性的值更改为YES。

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIImageView_Class/Reference/Reference.html

我还认为您可能需要继承UIImageView并将其用于您的成员变量,而不是直接的UIImageView。如果你想检测UIImageView上的触摸,你应该为UIImageView子类设置touchesBegan委托方法,而不是你的UIView子类。

尽管如此,您可以检测UIView中的触摸,然后使用CGRectContains查看它们是否正在触摸相应的UIImageView

答案 1 :(得分:1)

我无法重现这一点。你如何将TapStackView添加到其superview?从基于Window的模板,我刚刚将它添加到applicationDidFinishLaunching:

    [window addSubview:[[[TapStackView alloc] initWithFrame:[window bounds]] autorelease]];

它似乎按照您的预期运作:

2010-01-01 17:23:00.873 Untitled[3708:207] initWithFrame - powerOn.center is 215.000000, 90.000000
2010-01-01 17:23:02.940 Untitled[3708:207] -----
2010-01-01 17:23:02.941 Untitled[3708:207] touchesBegan - self.powerOn.center is 215.000000, 90.000000
2010-01-01 17:23:11.199 Untitled[3708:207] -----
2010-01-01 17:23:11.200 Untitled[3708:207] touchesBegan - self.powerOn.center is 215.000000, 90.000000
2010-01-01 17:23:11.663 Untitled[3708:207] -----
2010-01-01 17:23:11.664 Untitled[3708:207] touchesBegan - self.powerOn.center is 215.000000, 90.000000
2010-01-01 17:23:11.665 Untitled[3708:207] -----
2010-01-01 17:23:11.665 Untitled[3708:207] touchesBegan - self.powerOn.center is 215.000000, 90.000000

顺便说一句,你正在泄露backgroundImageViewpowerOn

答案 2 :(得分:0)

注意:我假设UIImageView子视图正确显示,并且它们确实具有非零中心。

这种情况很少见,但有时点符号无法正确解析。尝试旧的嵌套参考样式。

NSLog(@"touchesBegan - self.powerOn.center is %@",NSStringFromCGPoint([[self powerOn] center]);

如果这样可行,那么您可能会遇到链接问题。检查您是否为与UIImageViews相关的任何警告构建结果。有时链接器似乎松散了一些嵌套类。干净的一切通常可以解决问题。