【问题标题】:How to cut out or disable a section of a UIView?如何剪切或禁用 UIView 的一部分?
【发布时间】:2012-01-05 10:06:27
【问题描述】:

我有一个 UIView 的自定义子类 LineDrawingView。我将其作为主视图控制器中的@property 并将其添加到视图中。这很好用——它在当前视图之上创建一个透明视图,并使用 UIBezierPath、touchesBegan、touchesMoved 等,因此您可以通过拖动手指来绘制整个视图。

我需要将绘图视图设为“L”形,这样我就可以在左下角有一个区域来放置各种控件。我想不出任何办法使绘图视图为“L”形,除了可能添加两个单独的矩形绘图视图,但这不起作用,因为当您将手指从一个矩形拖动到另一个矩形时,触摸会中断。我想出的另一个解决方案是在绘图视图之上添加另一个视图。这个视图应该阻止绘图,我还可以在其中找到我的控件,以便在启用绘图时它们仍然可用。

我尝试创建一个 UIView 并将其添加为绘图视图的子视图。我给它染色了,这样我就可以检查它是否存在并且在正确的位置。我希望这可以防止在新 UIView 的区域内绘图,但在 LineDrawingView 的整个区域内继续绘图。我还尝试在索引 2 处插入新的 UIView,在索引 1 处插入 LineDrawingView。它仍然没有影响绘图。

    self.drawView = [[LineDrawingView alloc] initWithFrame:CGRectMake(0, 50, 768, 905)];
    [self.drawView setBackgroundColor:[UIColor clearColor]];

    // not effective in preventing drawing!!
    UIView *controlView = [[UIView alloc] initWithFrame:CGRectMake(0, 530, 310, 575)];
    [controlView setUserInteractionEnabled:NO];
    [controlView setBackgroundColor:[UIColor grayColor]];
    [controlView setAlpha:0.3];

    [self.view addSubview:drawView];
    [self.drawView addSubview:controlView];

我很想知道:我怎么能...

创建一个“L”形的图纸视图? 或者 切出绘图视图的一部分,以便用户可以与它后面的内容进行交互? 或者 在绘图视图顶部施加一个区域,我可以在其中禁用绘图并添加我的控件?

【问题讨论】:

    标签: ios uiview uibezierpath


    【解决方案1】:

    Here is a tutorial on creating a transparent rounded rectangle UIView,我认为您可以直接对其进行修改以使其成为 L 形。

    要记住的最重要的事情是,您必须实现自己的 drawRect,而且我相信您自己的 hitTest 或触摸(例如,像 touchedBegan:withEvent: 这样的事件处理)方法。

    【讨论】:

    • 谢谢 - 好主意,但不幸的是它不起作用。我不知道自从该教程发布后的几年里到底发生了什么变化,但是在完全实现了那里显示的内容之后,我没有得到预期的效果。我没有在圆角上获得透明度,当我将 RoundedRect 视图的填充颜色设置为 clearColor 时,它只会变成黑色 - 你看不到它下面的任何东西。我将此 RoundedRect 视图添加为我的主视图的子视图。我什至没有尝试用它实现任何绘图代码。
    【解决方案2】:

    我就此联系了 Apple。事实证明,没有办法创建“L”形视图。解决方案是在绘图视图中测试触摸是否在禁止区域内,如果是,则阻止绘制线。我的控件已移至单独的 UIView,当启用绘图时,该 UIView 移至前面。这意味着控件始终保持活动状态,并且无法在控件区域内进行绘图。

    【讨论】:

      【解决方案3】:

      如果您想绘制 L 形绘图视图,您可以通过仅连接两行来做到这一点.. 就像我创建了一个箭头.. 如果您想在移动(拖动)任何对象时停止绘图。 . 你只需要在你的 touchesmoved 方法中应用一个检查(比如 ismoved , )..

      这里是绘制箭头的代码(你可以参考它来绘制任何形状):How can I draw an arrow using Core Graphics?

      检查您是否点击路径的代码(意味着您的接触点在贝塞尔路径中)

      if([[self tapTargetForPath:((UIBezierPath *)[testDict objectForKey:@"path"])] containsPoint:startPoint])// if starting touch is in bezierpath
              {
                          ishitInPath = YES;
                          isMoving = YES;
      }
      
      
      // to easily detect (or select a bezier path object)
      - (UIBezierPath *)tapTargetForPath:(UIBezierPath *)path
      {
          if (path == nil) {
              return nil;
          }
      
          CGPathRef tapTargetPath = CGPathCreateCopyByStrokingPath(path.CGPath, NULL, fmaxf(35.0f, path.lineWidth), path.lineCapStyle, path.lineJoinStyle, path.miterLimit);
          if (tapTargetPath == NULL) {
              return nil;
          }
      
          UIBezierPath *tapTarget = [UIBezierPath bezierPathWithCGPath:tapTargetPath];
          CGPathRelease(tapTargetPath);
          return tapTarget;
      }
      

      【讨论】:

        猜你喜欢
        • 2013-02-25
        • 1970-01-01
        • 2012-10-28
        • 2018-07-04
        • 2012-05-17
        • 1970-01-01
        • 2015-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多