UIButton在iOS 7中无法正常工作

时间:2013-09-30 14:14:58

标签: ios objective-c uibutton

我遇到的问题是UIButton在iOS6中运行得非常好,但在某些时候无法响应iOS7中的触摸事件。 澄清请参见下图:

ios7_button_issue

失败的按钮是UIView中的“全部放弃”按钮。 (请注意,此按钮仅暂时禁用,这不是问题。我只是没有启用按钮的最新测试的屏幕截图“)

此按钮忽略所有触摸,除非首先按下UITableViewCell中的“Discard”或“Retry”按钮。 (这确实会导致重新加载视图控制器,从而触发再次调用ViewDidLoad等生命周期方法。) 按下表格视图单元格中的“放弃”或“重试”按钮后,“全部放弃”按钮开始正常运行。

视图和“全部放弃”按钮构建在Controller的XIB文件上,而不是代码中。这仅在iOS7上失败,并在触摸到taleview单元格按钮后立即开始工作。

有人有什么想法吗?

谢谢!

10 个答案:

答案 0 :(得分:17)

昨晚我找到了解决方案。 好的,所以我将上面的表视图和UIView元素放在目标框架上。

我不是百分百肯定,但似乎在iOS6中按钮会响应事件,而不管它们放在何处。 出于某种原因,在iOS7中,当按钮位于框架之外时,它应该在其中,它会忽略触摸事件,即使它确实显示出来。

我通过将视图的框架放在正确的位置来解决问题,因此它覆盖了按钮。

如果我能找到有关此问题的任何文件,我会在此发布。

谢谢!

答案 1 :(得分:7)

我刚遇到这个问题。根据 @Guntis Treulands 的建议,我决定检查如果我在自定义标题视图中覆盖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];
}

答案 2 :(得分:2)

作为一个替代答案 - 实际上对我来说,这从来没有奏效(如果uibutton在它的父视图之外,那么它将不会接触到。) - 但在某些情况下,需要将按钮放在它的边界之外。

出于这个原因,有一个hittest函数,可以被覆盖 - 只需检查父视图所有子视图,找到放置在父视图边界之外的uibutton。 (然后你会检查每个子视图,如果它是uibutton类型,并且触摸的坐标是在uibuttons框架内。

默认情况下,hittest函数会跳过检查视图,这些视图位于边界之外。

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

答案 3 :(得分:1)

不确定这是否是相同的情况,但可能是相关的:

当UIButton在UIGestureRecognizer的视图中没有将delayedTouchesEnded设置为NO(默认为YES)时,该按钮将不再在iOS 7中获得TouchUpInside事件。它在i​​OS 6中获取TouchUpInside事件。< / p>

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

我遇到了同样的问题 - 按钮在iOS6上工作但在iOS7上没有,问题在于我正在添加UIView的容器UIButtons,我向容器{{1添加了约束它开始工作了。在我的案例中我必须添加的代码:

UIView

答案 6 :(得分:0)

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

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

如果结果为0(或者不够大),则将UIView的高度设置为大于“全部放弃”按钮的高度。

答案 7 :(得分:0)

检查父框架内的按钮

答案 8 :(得分:0)

我也遇到了同样的问题,但在下面的代码按钮操作添加正常后cell.contentView.userInteractionEnabled = NO;

答案 9 :(得分:-1)

好吧,似乎在iOS7中以编程方式创建的按钮不会调用它们的目标。 我不知道为什么,但我找到了以下解决方案:

  1. 在InterFace Builder(或笔尖)中添加一个按钮并自定义并隐藏它。 (theButtonInTheNib);

  2. 将其设为IBOutlet属性:@property (strong) IBOutlet UIButton *theButtonInTheNib

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

  4. 这就是诀窍。我们将复制或复制此按钮:

    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];
    

    我再次添加了目标操作,但任何其他操作都可以。