我遇到的问题是UIButton在iOS6中运行得非常好,但在某些时候无法响应iOS7中的触摸事件。 澄清请参见下图:
失败的按钮是UIView中的“全部放弃”按钮。 (请注意,此按钮仅暂时禁用,这不是问题。我只是没有启用按钮的最新测试的屏幕截图“)
此按钮忽略所有触摸,除非首先按下UITableViewCell中的“Discard”或“Retry”按钮。 (这确实会导致重新加载视图控制器,从而触发再次调用ViewDidLoad等生命周期方法。) 按下表格视图单元格中的“放弃”或“重试”按钮后,“全部放弃”按钮开始正常运行。
视图和“全部放弃”按钮构建在Controller的XIB文件上,而不是代码中。这仅在iOS7上失败,并在触摸到taleview单元格按钮后立即开始工作。
有人有什么想法吗?
谢谢!
答案 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事件。它在iOS 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中以编程方式创建的按钮不会调用它们的目标。 我不知道为什么,但我找到了以下解决方案:
在InterFace Builder(或笔尖)中添加一个按钮并自定义并隐藏它。 (theButtonInTheNib
);
将其设为IBOutlet属性:@property (strong) IBOutlet UIButton *theButtonInTheNib
制作目标IBAction连接:(IBAction)theTargetAction:(id)sender;
这就是诀窍。我们将复制或复制此按钮:
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];
我再次添加了目标操作,但任何其他操作都可以。