2010-05-23 3 views
4

Мой пользовательский подкласс расширить UIControl (EditableImageView) В основном он содержит 3 подвидами:вперед событие из пользовательского UIControl подкласса

  • UIButton (UIButtonTypeCustom)
  • UIImageView
  • UILabel

Все класс отлично работает, но теперь я хочу связать некоторые события, созданные из этого класса, другому. В частности, , когда кнопка нажата, я хочу переслать событие владельцу viewcontroller, чтобы я мог обработать событие. Проблема в том, что я не могу понять, как реализовать это поведение. В EditableImageView я могу поймать событие касания, используя [button addTarget: self action: @selector (buttonPressed :) forControlEvents: UIControlEventTouchUpInside], но я не знаю, как переправить его внутри кнопки. я также пытался реализовать touchesBegan, но кажется, никогда не называли ...

Я хотел бы, чтобы захватить кнопку пресс событие из ViewController таким образом:

- (void)viewDidLoad { 
[super viewDidLoad]; 

self.imageButton = [[EditableImageView alloc] initWithFrame:CGRectMake(50.0f, 50.0f, 80.0f, 80.0f)]; 
[imageButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
[self.view addSubview:imageButton]; 
[imageButton setEditing:NO]; 

}

Это мой метод инициализации подкласса UIControl:

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     [self setBackgroundColor:[UIColor clearColor]]; 

     button = [UIButton buttonWithType:UIButtonTypeCustom]; 
     button.frame = CGRectMake(0.0f, 0.0f, frame.size.width, frame.size.height); 
     [button setImage:[UIImage imageNamed:@"nene_70x70.png"] forState:UIControlStateNormal]; 
     [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 

     [self addSubview:button]; 

     transparentLabelBackground = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"editLabelBackground.png"]]; 
     transparentLabelBackground.hidden = YES; 
     [self addSubview:transparentLabelBackground]; 

     // create edit status label 
     editLabel = [[UILabel alloc] initWithFrame:CGRectZero]; 
     editLabel.hidden = YES; 
     editLabel.userInteractionEnabled = NO; // without this assignment the button will not be clickable 
     editLabel.textColor = [UIColor whiteColor]; 
     editLabel.backgroundColor = [UIColor clearColor]; 
     editLabel.textAlignment = UITextAlignmentLeft; 
     UIFont *labelFont = [UIFont systemFontOfSize:16.0]; 
     editLabel.font = labelFont;  
     editLabel.text = @"edit"; 
     labelSize = [@"edit" sizeWithFont:labelFont]; 

     [self addSubview:editLabel]; 
    } 

    return self; 
} 

Спасибо.

ответ

6

Я решил таким образом:

EditableImageView.h:

@interface EditableImageView : UIControl { 
UIButton *button; 
UIImageView *transparentLabelBackground; 
UILabel *editLabel; 
CGSize labelSize; 

BOOL editing; 
} 

@property (nonatomic, retain) UIButton *button; 
@property (nonatomic, retain) UILabel *editLabel; 
@property (nonatomic, retain) UIImageView *transparentLabelBackground; 
@property (nonatomic, getter=isEditing) BOOL editing; 

- (void)buttonPressed:(id)sender; 
@end 

EditableImageView.m:

(id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     [self setBackgroundColor:[UIColor clearColor]]; 

     button = [UIButton buttonWithType:UIButtonTypeCustom]; 
     button.frame = CGRectMake(0.0f, 0.0f, frame.size.width, frame.size.height); 
     [button setImage:[UIImage imageNamed:@"nene_70x70.png"] forState:UIControlStateNormal]; 
     [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
     ....... 
    } 
} 


- (void)buttonPressed:(id)sender { 
[self sendActionsForControlEvents:UIControlEventTouchUpInside]; 
} 

MyController.m:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.imageButton = [[EditableImageView alloc] initWithFrame:CGRectMake(50.0f, 50.0f, 80.0f, 80.0f)]; 
    [imageButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:imageButton]; 
} 

- (void)buttonPressed:(id)sender { 
    NSLog(@"buttonPressed!"); 
}