我陷入一个奇怪的问题,我正在制作键盘扩展,我需要在触摸时绘制按键的高亮显示。我成功地做到了这一点,但是对于左上角的一些按键特别是按键 Q 和 A ,每次都不会突出显示。主要是我的代码看起来像..
touchbegan
- 通过调用[keysLayer setNeedsDisplay];
touchEnd
- 再次拨打[keysLayer setNeedsDisplay];
所以基本上, drawRect
函数不会在这些特定键上每次调用,其他一切正常,甚至setNeedsDisplay
被调用。
所以,我正在寻求帮助,可以通过 drawRect 函数来调用,我想知道原因列表。
如果有人可以帮助我。
更新
添加代码
在SuperView中添加了KeysLayer视图。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
keysLayer.drawHighlight=YES;
keysLayer.touchLocation=[touch locationInView:self];
[keysLayer setNeedsDisplay];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesEnded:touches withEvent:event];
keysLayer.drawHighlight=NO;
[keysLayer setNeedsDisplay];
}
在 KeysLayer UIView类
中- (void)setTouchLocation:(CGPoint)location{
self.touchLocation=location;
bezierPathForHighlight=[self createHighLightPath];//Creating simple path based on touch location.
}
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
if(!self.drawHighlight)
[bezierPathForHighlight removeAllPoints];
[bezierPathForHighlight stroke];
CGContextRestoreGState(context);
}
更新2
所以,我发现了问题,它只发生在 iPhone6 iOS9.0 。我使用此test application验证了这一点。令人惊讶的是,在这个测试应用程序中,我发现有一个特殊的触摸区域,iOS不会将 drawRect 称为 iOS BUG?
请参阅下面的附图,其中说明了实际发生的位置。我们有一个问题,没有解决方案。需要帮助。
感谢。
答案 0 :(得分:4)
问题似乎特定于iOS 9
以后。我也可以在其他设备上复制它。问题似乎与UIWindow
手势识别器有关。当我检查你的(@iphonic)示例代码时,我发现如果我在该特定位置点击并按住一秒钟,那么drawRect就会被调用:)。所以在我看来,那些地方有delay in touches
。
所以我开始调试不同地方的触摸,发现_UISystemGestureGateGestureRecognizer
私有类在这些区域中具有不同的属性,我所做的就是通过附加到{{1}的手势识别器循环并将UIWindow
属性设置为delaysTouchesBegan
,就是这样。
问题得到解决。实际上问题不是特定于该特定区域,而是屏幕的左角可能是NO
已经为它做了一些实现。虽然现在工作正常。我会继续观察,但暂时还是适合你的工作。
以下是您需要添加的一些示例代码。
Apple
在视图显示后,在- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
for (UIGestureRecognizer *gesture in self.view.window.gestureRecognizers) {
gesture.delaysTouchesBegan = NO;
}
}
中添加此代码。