点击时不会触发自定义 UIView 中的 UIButton
UIButton in a custom UIView is not being triggered when tapped upon
我在自定义 UIView CustomButtonView 中放置了一个 UIButton。 UIButton 未响应 tap/click 事件,并且未触发其相应的选择器方法。下面是我的代码;我做错了什么?
此外,自定义视图的背景颜色为红色。当我将自定义视图添加到我的视图控制器的视图时,会显示红色矩形。但是,当我将 UIButton 添加到我的自定义视图(背景颜色为红色)时,仅显示 UIButton,而不显示红色矩形。为什么会这样?
//
// CustomButtonView.h
//
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface CustomButtonView : UIView
@property (strong, nonatomic) UIImageView *buttonImageView;
@property (strong, nonatomic) UIButton *button;
@end
NS_ASSUME_NONNULL_END
//
// CustomButtonView.m
//
#import "CustomButtonView.h"
@implementation CustomButtonView
- (instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor redColor];
_button = [UIButton buttonWithType:UIButtonTypeSystem];
_button.backgroundColor = [UIColor greenColor];
[_button setTitle:@"john doe" forState:UIControlStateNormal];
[_button setTitle:@"john doe" forState:UIControlStateHighlighted];
_button.translatesAutoresizingMaskIntoConstraints = NO;
_button.titleLabel.font = [UIFont boldSystemFontOfSize:14.0];
_button.titleLabel.textColor = [UIColor whiteColor];
self.userInteractionEnabled = NO;
self.button.userInteractionEnabled = YES;
//[self addSubview:_button];
//[_button.topAnchor constraintEqualToAnchor:self.topAnchor].active = YES;
//[_button.leadingAnchor constraintEqualToAnchor:self.leadingAnchor].active = YES;
}
return self;
}
@end
//
// ViewController.m
// TestApp
//
//
#import "ViewController.h"
#import "CustomButtonView.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor yellowColor];
_customButtonView = [[CustomButtonView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
_customButtonView.backgroundColor = [UIColor redColor];
_customButtonView.translatesAutoresizingMaskIntoConstraints = NO;
[_customButtonView.button addTarget:self action:@selector(customButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_customButtonView];
}
- (void)customButtonTapped:(id)sender{
NSLog(@"Button tapped!");
}
@end
下面是一些屏幕截图。请点击链接。
When I display the UIButton inside the custom-view, only the button displays. The red rectangle of the custom-view doesn't display.
When I simply add the custom-view to my view-controller (ie with no UIButton added to the custom view), the red rectangle of the custom-view displays.
当您禁用特定视图的用户交互时,此用户交互不会转发到其子视图。或者换句话说;为了使用户交互正常工作,您需要确保链中的所有超级视图(超级视图的超级视图的超级视图)都启用了用户交互。
在您的情况下,您有 self.userInteractionEnabled = NO;
,这意味着 self
的任何子视图(包括您的按钮)都不会接受任何用户交互。
除此问题外,仍有可能存在其他问题。例如:子视图将仅在其所有父视图的物理区域内接受用户交互。这意味着如果将带有框架 { 0, 0, 100, 100 }
的按钮放置在大小为 { 100, 50 }
的父视图上,则只有按钮的顶部是可点击的。
至于尺寸变化,这是完全不同的故事......
您决定通过编写 _customButtonView.translatesAutoresizingMaskIntoConstraints = NO;
在您的自定义视图上禁用自动调整掩码的转换。这意味着您不会将 frame
与其他约束一起使用。这意味着无论您设置什么框架(在您的情况下 CGRectMake(0, 0, 100, 100)
),该框架都将被可能影响自定义视图框架的任何其他内容覆盖。
如果您的按钮代码被注释掉,则不会出现“可能影响您的自定义视图的框架”这样的事情,并且视图保持 { 100, 100 }
的大小。但是一旦你添加了一个按钮,你就添加了额外的约束,这很可能会导致将你的按钮调整为 sizeToFit
以及它的超级视图,这是你的自定义视图。
为避免这种情况,您需要取消禁用将自动调整大小掩码转换为自定义视图约束的功能。或者您需要通过向其添加约束来定义自定义视图大小,以便将它们设置为 { 100, 100 }
。您可以简单地将 heightAnchor
和 widthAnchor
约束为 100
.
我在自定义 UIView CustomButtonView 中放置了一个 UIButton。 UIButton 未响应 tap/click 事件,并且未触发其相应的选择器方法。下面是我的代码;我做错了什么?
此外,自定义视图的背景颜色为红色。当我将自定义视图添加到我的视图控制器的视图时,会显示红色矩形。但是,当我将 UIButton 添加到我的自定义视图(背景颜色为红色)时,仅显示 UIButton,而不显示红色矩形。为什么会这样?
//
// CustomButtonView.h
//
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface CustomButtonView : UIView
@property (strong, nonatomic) UIImageView *buttonImageView;
@property (strong, nonatomic) UIButton *button;
@end
NS_ASSUME_NONNULL_END
//
// CustomButtonView.m
//
#import "CustomButtonView.h"
@implementation CustomButtonView
- (instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor redColor];
_button = [UIButton buttonWithType:UIButtonTypeSystem];
_button.backgroundColor = [UIColor greenColor];
[_button setTitle:@"john doe" forState:UIControlStateNormal];
[_button setTitle:@"john doe" forState:UIControlStateHighlighted];
_button.translatesAutoresizingMaskIntoConstraints = NO;
_button.titleLabel.font = [UIFont boldSystemFontOfSize:14.0];
_button.titleLabel.textColor = [UIColor whiteColor];
self.userInteractionEnabled = NO;
self.button.userInteractionEnabled = YES;
//[self addSubview:_button];
//[_button.topAnchor constraintEqualToAnchor:self.topAnchor].active = YES;
//[_button.leadingAnchor constraintEqualToAnchor:self.leadingAnchor].active = YES;
}
return self;
}
@end
//
// ViewController.m
// TestApp
//
//
#import "ViewController.h"
#import "CustomButtonView.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor yellowColor];
_customButtonView = [[CustomButtonView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
_customButtonView.backgroundColor = [UIColor redColor];
_customButtonView.translatesAutoresizingMaskIntoConstraints = NO;
[_customButtonView.button addTarget:self action:@selector(customButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_customButtonView];
}
- (void)customButtonTapped:(id)sender{
NSLog(@"Button tapped!");
}
@end
下面是一些屏幕截图。请点击链接。
When I display the UIButton inside the custom-view, only the button displays. The red rectangle of the custom-view doesn't display.
When I simply add the custom-view to my view-controller (ie with no UIButton added to the custom view), the red rectangle of the custom-view displays.
当您禁用特定视图的用户交互时,此用户交互不会转发到其子视图。或者换句话说;为了使用户交互正常工作,您需要确保链中的所有超级视图(超级视图的超级视图的超级视图)都启用了用户交互。
在您的情况下,您有 self.userInteractionEnabled = NO;
,这意味着 self
的任何子视图(包括您的按钮)都不会接受任何用户交互。
除此问题外,仍有可能存在其他问题。例如:子视图将仅在其所有父视图的物理区域内接受用户交互。这意味着如果将带有框架 { 0, 0, 100, 100 }
的按钮放置在大小为 { 100, 50 }
的父视图上,则只有按钮的顶部是可点击的。
至于尺寸变化,这是完全不同的故事......
您决定通过编写 _customButtonView.translatesAutoresizingMaskIntoConstraints = NO;
在您的自定义视图上禁用自动调整掩码的转换。这意味着您不会将 frame
与其他约束一起使用。这意味着无论您设置什么框架(在您的情况下 CGRectMake(0, 0, 100, 100)
),该框架都将被可能影响自定义视图框架的任何其他内容覆盖。
如果您的按钮代码被注释掉,则不会出现“可能影响您的自定义视图的框架”这样的事情,并且视图保持 { 100, 100 }
的大小。但是一旦你添加了一个按钮,你就添加了额外的约束,这很可能会导致将你的按钮调整为 sizeToFit
以及它的超级视图,这是你的自定义视图。
为避免这种情况,您需要取消禁用将自动调整大小掩码转换为自定义视图约束的功能。或者您需要通过向其添加约束来定义自定义视图大小,以便将它们设置为 { 100, 100 }
。您可以简单地将 heightAnchor
和 widthAnchor
约束为 100
.