从自定义 UIControl 子类转发事件

发布于 2024-09-02 10:32:45 字数 2339 浏览 8 评论 0原文

我的自定义子类扩展 UIControl (EditableImageView) 基本上它包含 3 个子视图:

  • UIButton (UIButtonTypeCustom)
  • UIImageView
  • UILabel

所有类都工作得很好,但现在我想将从此类生成的一些事件连接到另一个类。特别是当按下按钮时,我想将事件转发给所有者视图控制器,以便我可以处理该事件。问题是我不知道如何实现这种行为。 在 EditableImageView 中,我可以使用 [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside] 捕获触摸事件,但我不知道如何在 buttonPressed 选择器内部转发它。 我也尝试实现touchesBegan,但它似乎从未被调用过...

我想以这种方式从视图控制器捕获按钮按下事件:

- (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;
}

谢谢。

My custom subclass extend UIControl (EditableImageView)
Basically it contains 3 subviews:

  • UIButton (UIButtonTypeCustom)
  • UIImageView
  • UILabel

All the class works great but now I want to connect some events generated from this class to another. In particular when the button is pressed I want to forward the event to the owner viewcontroller so that I can handle the event. The problem is that I can't figure out how to implement this behaviour.
Within EditableImageView I can catch the touch event using [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside] but I don't know how to forward it inside of the buttonPressed selector.
I also tried to implement touchesBegan but it seems never called...

I'd like to capture the button press event from the viewcontroller in this way:

- (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];

}

This is my UIControl subclass initialization method:

- (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;
}

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

Smile简单爱 2024-09-09 10:32:45

我用这种方式解决了:

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!");
}

I solved in this way:

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!");
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文