【问题标题】:Forward event from custom UIControl subclass从自定义 UIControl 子类转发事件
【发布时间】:2011-02-23 00:57:51
【问题描述】:

我的自定义子类扩展 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;
}

谢谢。

【问题讨论】:

    标签: iphone events subclass uicontrol


    【解决方案1】:

    我是这样解决的:

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

    【讨论】:

      猜你喜欢
      • 2017-10-02
      • 2011-07-09
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 2011-03-25
      相关资源
      最近更新 更多