【问题标题】:UIButton selector doesn't work in nested UIViewsUIButton 选择器在嵌套的 UIView 中不起作用
【发布时间】:2012-08-10 19:25:58
【问题描述】:

我有这个问题让我发疯。我花了几十年的时间来弄清楚为什么会这样。

我在UIView 中有一个UIScrollView 作为scrollView。在这个滚动视图中,我有三个不同的UIViews,它们是在运行时创建的。在这三个UIViews 之一中,我创建了一个按钮。这是我的代码。

        UIButton *buttonLike = [UIButton buttonWithType:UIButtonTypeRoundedRect ] ;
        buttonLike.frame =CGRectMake(scrollViewWidth +200, 30,36, 16);
        buttonLike.imageView.image = [UIImage imageNamed:@"like.png"];
        [buttonLike addTarget:self action:@selector(buttonLikePressed:) forControlEvents:UIControlEventTouchUpInside] ;

scrollViewWidth 也是一个定义和初始化的常量。
而且,我将此 buttonLike 添加为 UIViews 之一中的子视图。但是,无论我做什么, buttonLikePressed 方法都不会调用。 我已经搜索了这个问题并提出了这些解决方案。

Iphone UIButton not working in nested UIViews
iPhone SDK 2: UIButton not working in nested views loaded from nib file

他们描述了同样的问题。但是,作为一种解决方案,他们使用
-(id)initWithFrame:(CGRect)aRect 方法初始化他们的视图。好吧,我已经使用initWithFramemethod 初始化了我的UIViews。你们知道我该如何解决这个问题吗?

谢谢大家

【问题讨论】:

  • 你是如何使用 initWithFrame 初始化所有这些视图的?

标签: iphone ios uiview uiscrollview


【解决方案1】:

您的按钮是否会对触摸做出反应?按下时会高亮吗?

因为听起来您正在将此按钮添加到该视图边界之外的视图中,这会阻止触摸传播到该按钮。您必须将该视图的宽度增加到scrollViewWidth + 200 + 36 或更多,或者您需要将按钮放在视图的边界内。向我们展示您如何创建向其中添加按钮的视图。

【讨论】:

  • UIView *viewNewsProperties = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 60)]; [viewNewsProperties addSubView :buttonLike ] ;我将此视图添加到 scrollView。
  • 我猜你的 scrollView 也是 320 像素宽?因此,您要向 320 + 200 添加一个按钮,该按钮距 viewNewsProperties 的左边界 520 像素,并且将其放置在其 320 像素边界之外。您需要使 viewNewsProperties 的框架更宽(如 CGRectMake(0, 0, 556, 60))。
  • 不客气。当您遇到此类问题时,要做的第一件事是在“非响应”视图的超级视图及其超级视图等上设置不同的背景颜色。这使您无需在脑海中进行计算即可查看是否超出范围。例如,在 scrollView 上设置绿色背景,在 viewNewsProperties 上设置红色,在按钮上设置蓝色,你会看到蓝色在红色之外,这是不好的 :)
  • @FilipRadelic 你是对的! .. 但理想情况下,UIView 应该在父框架适合的情况下剪辑该按钮。
  • @Jack 当然,您可以使视图剪辑到边界并且按​​钮不可见。这些天你也可以在 Xcode 中使用视图调试器,这对这两种情况都有帮助:)
【解决方案2】:

您应该使用 initWithFrame 初始化所有这些视图,并且您应该传入有效的框架矩形。 试试这个,你喜欢的按钮就会起作用!

【讨论】:

  • 我已经用 initWithFrame 初始化了我的视图,我很确定我通过了有效的框架矩形。
【解决方案3】:

我认为 UIButton 应该首先获得触摸事件,但我遇到了类似的问题,即按钮没有被按下。我最终做的是在父视图的 touchesBegan 方法中运行检查,以查看它是否触及按钮区域周围。这对我来说也很有帮助,因为我可以指定更大的区域,这样按钮更容易按下。然后我就触发了按钮的触摸事件。

另一种更容易的方法是将按钮的父视图的 isUserInteractionEnabled 设置为 false,当然前提是您不需要它们响应触摸。

这些只是解决问题的想法,不知道如何实际解决它。

【讨论】:

  • 哦,刚刚注意到可能是根本原因 - 您的按钮尺寸很小,我认为它们必须至少为 44x44 或其他东西才能工作。或者至少这是 Apple 推荐的最小按钮尺寸。
  • 我把它们放大了,但还是不行。你提到的第二种方法对我来说不是一个好方法,就像你解释了原因一样。
  • 可能父视图正在剪裁按钮。尝试在父视图中将 clipSubviews 设置为 NO。你真的能看到屏幕上的按钮,只是无法按下它还是根本不显示?
猜你喜欢
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 2021-03-17
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
相关资源
最近更新 更多