每次都没有调用drawRect

时间:2015-10-08 12:01:19

标签: ios objective-c drawrect ios-extensions

我陷入一个奇怪的问题,我正在制作键盘扩展,我需要在触摸时绘制按键的高亮显示。我成功地做到了这一点,但是对于左上角的一些按键特别是按键 Q A ,每次都不会突出显示。主要是我的代码看起来像..

  1. 点击touchbegan - 通过调用[keysLayer setNeedsDisplay];
  2. 来突出显示
  3. 点击touchEnd - 再次拨打[keysLayer setNeedsDisplay];
  4. 删除突出显示

    所以基本上, 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?

    请参阅下面的附图,其中说明了实际发生的位置。我们有一个问题,没有解决方案。需要帮助。

    enter image description here

    感谢。

1 个答案:

答案 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; } } 中添加此代码。