UIControl addTarget:action:forControlEvents:除非与超级视图相同大小,否则无法正常工作

Posted

技术标签:

【中文标题】UIControl addTarget:action:forControlEvents:除非与超级视图相同大小,否则无法正常工作【英文标题】:UIControl addTarget:action:forControlEvents: not working unless same size as superview 【发布时间】:2014-10-20 10:37:09 【问题描述】:

例如

UIButton *b = [Uibutton alloc...
[b addTarget:self action:@selector(doSomething:) forControlEvents:UIControlEventTouchUpInside];

// Using Masonry to add constraints:
[b makeConstraints:^(MASConstraintMaker *make) 

  // Match superview - works
  make.top.left.bottom.right.equalTo(superview);

  // Smaller than superview - doesn't work
  make.top.left.right.top.equalTo(superview);
  make.height.equalTo(@32);
];

有什么想法吗?

我能找到的唯一参考问题是this question的答案,但细节上含糊不清。

【问题讨论】:

【参考方案1】:

我不熟悉 Masonry MASConstraintMaker,但我认为如果您使用 button.frame 也会发生同样的情况?或者由于某种原因您不能使用 button.frame?

如果您的按钮在它的超级视图之外,它将不起作用..这导致我建议(尽管有点天真和简单化)您的按钮被设置在它的超级视图之外...可能是因为它正在使用 superview.frame而不是 superview.bounds .. 这是您需要用于 superView 框架引用的内容

button.frame = CGRectMake(button.superview.bounds.origin.x, button.superview.bounds.origin.y, button.superview.bounds.size.width, 32.0f);

【讨论】:

谢谢。只是为了澄清一下:它不是特定于 Masonry 的,而只是视图的框架不包含在 superview 中。

以上是关于UIControl addTarget:action:forControlEvents:除非与超级视图相同大小,否则无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

UIControl.appearance().addTarget 停止在 Swift 4 上工作

Swift - UIControl addTarget 不起作用

UIControl addTarget:action:forControlEvents:除非与超级视图相同大小,否则无法正常工作

网易有道 iOS面经

UIControl笔记

覆盖 addTarget 方法