我使用这个方法创建了UIImageView的子类(称为MyPicture):
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.userInteractionEnabled = YES;
}
return self;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"-- I AM TOUCHED --");
}
// ...
当我使用InterfaceBuilder创建一个带有MyPicture类的UIImageView时,一切正常,控制台写道:“我被触摸了”。但仅限于,当我在IB中激活用户交互时。
但是当我以程序方式创建UIImageView时,它会起作用。 在ViewController.h中:
MyButton * foo;
在ViewController.m中:
- (void)viewDidLoad {
flo = [[UIImageView alloc]initWithFrame:CGRectMake(0.0, 45.0, 324, 52.0)];
foo.userInteractionEnabled = YES;
foo.image = [UIImage imageNamed:@"Picture 1.png"];
[self.view addSubview:foo];
[super viewDidLoad];
}
我可以看到图片,所以它必须是我的UIImageView子类。但为什么他没有发现这些接触?
答案 0 :(得分:4)
我不明白为什么它必须是你的子类。看到图片只是意味着它是一个UIImageView。这正是它的原因(不是子类)这里:
foo = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 45.0, 324, 52.0)];
您正在初始化UIImageView,而不是您的子类。尝试将该行更改为:
foo = [[MyPicture alloc] initWithFrame:CGRectMake(0.0, 45.0, 324, 52.0)];
编辑:此外,由于您在子类'initWithFrame:'方法中设置了userInteractionEnabled = YES,因此没有理由在此行中再次执行此操作:
foo.userInteractionEnabled = YES;
答案 1 :(得分:1)
当你继承UIImageView时,应用程序可以通过几种不同的方式调用对象。在Interface Builder中创建的UIImageViews是预编译的,并且无需调用-(id)init
方法即可加载到内存中。相反,它们在将nib的内容加载到内存后调用- (void)awakeFromNib
。
确保将您的类标识设置为您的子类,并在子类的awakeFromNib方法中设置userInteractionEnabled。这将允许您设置用户交互而无需绑定。
要以编程方式完全加载UIImageView,请确保从正确的类中进行分配。您的代码是从UIImageView超类调用的。
- (void)viewDidLoad {
foo = [[MyImageView alloc] initWithFrame:CGRectMake(0.0, 45.0, 324, 52.0)];
foo.image = [UIImage imageNamed:@"Picture 1.png"];
[self.view addSubview:foo];
[super viewDidLoad];
}
这将从您的子类而不是超类调用- (id)initWithFrame
并执行您的自定义代码。这也会将- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
调用发送到您的子类而不是超类。