如何自定义drawRect的输入

时间:2017-11-06 22:51:01

标签: objective-c uiview

这是我的drawRect代码:

- (void)drawRect:(CGRect)rect {
  if (currentLayer) {
    [currentLayer removeFromSuperlayer];
  }

  if (currentPath) {
    currentLayer = [[CAShapeLayer alloc] init];

      currentLayer.frame = self.bounds;


    currentLayer.path = currentPath.CGPath;

      if ([SettingsManager shared].isColorInverted) {
          currentLayer.strokeColor = [UIColor blackColor].CGColor;
      } else {
          currentLayer.strokeColor = [UIColor whiteColor].CGColor;

      }

      currentLayer.strokeColor = _strokeColorX.CGColor;




    currentLayer.fillColor = [UIColor clearColor].CGColor;
    currentLayer.lineWidth = self.test;

    currentLayer.contentsGravity = kCAGravityCenter;
    [self.layer addSublayer:currentLayer];

    //currentLayer.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
  }
  //[currentPath stroke];
}

“需要更新视图边界的部分”

那是来自apple dev docs。

我正在处理一个UIView和一个名为slate的设备 - 平板能够将铅笔画记录到我的iOS应用程序中。我设法让它在整个视图上工作。但是,我不希望整个视图充满平板输入。相反,我想修改UIView以获得phoneize的高度 - 40px;说得通?

2 个答案:

答案 0 :(得分:0)

我认为你在UIView中混淆了各种矩形的含义。 drawRect参数指定需要重绘的视图的部分部分。这可能是你调用setNeedsDisplay(rect),或者这可能是因为iOS认为需要重新绘制(例如因为屏幕被锁定而忽略了应用程序的绘图,现在用户解锁了屏幕并且当前的绘图是需要)。

此矩形与绘制内容的大小无关。绘制视图的区域大小由其框架和边界控制,前者通常使用“自动布局”(即布局约束对象)进行控制。

通常,在drawRect中,您可以查看视图的边界以获取要绘制的完整矩形。另一方面,drawRect的参数允许您优化绘图以仅重绘实际发生变化的部分。

此外,从drawRect内部操作视图和图层层次结构通常是一个坏主意。 UIView绘图机制希望您只在那里绘制当前视图的状态。由于它以递归方式遍历视图和子视图列表以调用drawRect,因此更改视图或图层列表会导致奇怪的副作用,例如在下次重绘之前跳过视图。

在状态更改方法或事件处理方法中创建和添加新图层,并使用自动布局或在layoutSubviews内部定位它们。

答案 1 :(得分:0)

我发现如果将我作为currentLayer的帧设置为新界限,则可以绘制的屏幕会相应地调整大小。