UIButton在iOS 7中无法正常工作

我有一个UIButton的问题,在iOS6中工作得非常好,但是无法响应iOS7中的触摸事件。 澄清请看下面的图片:

ios7_button_issue

失败的button是UIView中的“全部丢弃”button。 (请注意,这个button只是暂时禁用,这不是问题,我只是没有启用button的最新testing的屏幕截图)

这个button忽略所有的触摸,除非先按下UITableViewCell中的“Discard”或“Retry”button。 (这会导致重新加载视图控制器,从而触发像ViewDidLoad这样的生命周期方法再次被调用。)在表视图单元格中的“放弃”或“重试”button被按下之后,“放弃所有”button开始正常运作。

该视图和“全部丢弃”button是build立在控制器的XIB文件上,而不是代码中。 这仅在iOS7上失败,并且在触摸taleview单元格button后立即开始工作。

有人有主意吗?

谢谢!

我昨天晚上find了解决办法。 好的,所以会发生的是我把上面的表视图和UIView元素放到一个目标框架上。

我不是100%确定的,但似乎在iOS6中button响应事件,不pipe他们在哪里放置。 出于某种原因,当iOS7中的button位于框架之外时,它将忽略触摸事件,即使它显示。

我通过将视图的框架放置在正确的位置来覆盖button来解决问题。

如果我能find任何文件,我会在这里发表。

谢谢!

我刚刚面对这个问题。 根据@Guntis Treulands的build议,我决定检查会发生什么,如果我重写我的自定义标题视图中的hitTest:withEvent:方法。 此方法忽略隐藏的视图对象,禁用了用户交互,或者alpha级别小于0.01。 确定命中时,此方法不考虑视图的内容。 因此,即使指定的点位于视图的内容的透明部分中,仍然可以返回视图,并且现在在覆盖之后,接收到界限外的触摸。 它为我做了诡计。 希望它能帮助你,伙计们。

 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { if (!self.clipsToBounds && !self.hidden && self.alpha > 0) { for (UIView *subview in self.subviews.reverseObjectEnumerator) { CGPoint subPoint = [subview convertPoint:point fromView:self]; UIView *result = [subview hitTest:subPoint withEvent:event]; if (result != nil) { return result; } } } // use this to pass the 'touch' onward in case no subviews trigger the touch return [super hitTest:point withEvent:event]; } 

正如另一个答案 – 实际上对我来说,这从来没有工作过(如果uibutton在它的父视图之外,那么它将不会接触)。但是在某些情况下,它需要将button放在边界之外。

出于这个原因,有一个hittest函数,可以被覆盖 – 简单地检查父视图的所有子视图来查找放置在父视图边界之外的uibutton。 (你会然后检查每个子视图,如果它是uibuttontypes,并且如果触及的坐标是在uibuttons框架内。

默认情况下,hittest函数会跳过检查视图,这是外部边界。

Hittest示例: https ://stackoverflow.com/questions/17246488/best-way-to-perform-the-hit-test-objective-c。

不知道这是不是相同的情况,但可能是相关的:

当UIButton在UIGestureRecognizer视图中没有设置“延迟触发”为NO(默认值为“是”)时,该button在iOS 7中将不再获得TouchUpInside事件。它在i​​OS 6中获取TouchUpInside事件。

如果可能,请将UIGestureRecognizer的delaysTouchesEnded属性设置为NO以解决问题。

这很奇怪,但我正在开发iOS 7的新应用程序,并设置[cell.contentView setUserInteractionEnabled: YES]; 实际上为我工作。

我有这个相同的问题 – button没有在iOS6上工作,并没有在iOS7上,问题是容器UIView哪一个我添加UIButtons ,我添加约束容器UIView ,它开始工作。 代码,我不得不在我的情况下添加:

 [superView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V: [_controllersView]-|" options:0 metrics:nil views:views]]; [superView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_controllersView(70)]" options:0 metrics:nil views:views]]; [superView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_controllersView]|" options:0 metrics:nil views:views]]; 

如果它使用自动布局,则尝试在-viewDidAppear中添加日志语句:

 NSLog(@"Height of UIView: %f", self.<name of UIView>.frame.size.height); 

如果结果为0(或不够大),则将UIView的高度设置为比“全部丢弃”button的高度大。

检查内部父框架中的button

我也有同样的问题,但添加下面的代码button操作正常工作cell.contentView.userInteractionEnabled = NO;

好吧,看起来像在iOS7编程方式创build的button不会调用他们的目标。 我不知道为什么,但我find了以下解决scheme:

  1. 在InterFace Builder(或者nib)中添加一个button并自定义并隐藏它。 ( theButtonInTheNib );

  2. 使它IBOutlet属性: @property (strong) IBOutlet UIButton *theButtonInTheNib

  3. 做目标IBAction连接: (IBAction)theTargetAction:(id)sender;

诀窍来了。 我们将复制或复制此button:

 NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:theButtonInTheNib]; UIButton *theCopyButton = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; [theCopyButton setHidden:NO]; [theCopyButton setFrame:CGRectMake(x, y, width, height)]; [theCopyButton addTarget:self action:@selector(theTargetAction:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:theCopyButton]; 

我再次添加了目标操作,但是其他任何操作都将起作用。