我有一个非常简单的应用程序,而且我只是在开始时卡住了。 让我在这里发布代码。
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属性。 有什么想法吗?
答案 0 :(得分:1)
您需要在视图上设置.userInteractionEnabled:
myView.userInteractionEnabled = YES;
从文档中:默认情况下,新图像视图对象配置为忽略用户事件。如果要在UIImageView的自定义子类中处理事件,则必须在初始化对象后显式将userInteractionEnabled属性的值更改为YES。
我还认为您可能需要继承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
顺便说一句,你正在泄露backgroundImageView
和powerOn
。
答案 2 :(得分:0)
注意:我假设UIImageView子视图正确显示,并且它们确实具有非零中心。
这种情况很少见,但有时点符号无法正确解析。尝试旧的嵌套参考样式。
NSLog(@"touchesBegan - self.powerOn.center is %@",NSStringFromCGPoint([[self powerOn] center]);
如果这样可行,那么您可能会遇到链接问题。检查您是否为与UIImageViews相关的任何警告构建结果。有时链接器似乎松散了一些嵌套类。干净的一切通常可以解决问题。