Ios 如何剪切或禁用UIView的一部分?

Ios 如何剪切或禁用UIView的一部分?,ios,uiview,uibezierpath,Ios,Uiview,Uibezierpath,我有一个自定义的UIView子类LineDrawingView。我在主视图控制器中将其作为@属性,并将其添加到视图中。这很好-它在当前视图的顶部创建一个透明视图,并使用UIBezierPath、ToucheSBegind、touchesMoved等,因此您可以通过拖动手指来绘制整个视图 我需要使该工程视图为“L”形,这样我就可以在左下角有一个区域,其中有各种控件。除了添加两个单独的矩形工程视图外,我想不出任何方法使工程视图成为“L”形,但这不起作用,因为当您将手指从一个矩形拖动到另一个矩形时,触

我有一个自定义的UIView子类LineDrawingView。我在主视图控制器中将其作为@属性,并将其添加到视图中。这很好-它在当前视图的顶部创建一个透明视图,并使用UIBezierPath、ToucheSBegind、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”形工程视图? 或 剪切工程视图的一部分,以便用户可以与它后面的内容交互? 或 在工程视图顶部设置一个区域,在该区域中我可以禁用绘图并添加控件?

,我认为您可以直接修改该区域,使其成为L形


需要记住的最重要的一点是,您必须实现自己的
drawRect
,我相信您也可以实现自己的or-Touch(例如类似事件处理的)方法。

我就此联系了苹果公司。事实证明,没有办法创建“L”形视图。解决方案是,在工程视图中,测试接触是否在禁止区域内,如果在禁止区域内,则防止绘制线。“我的控件”已移动到一个单独的UIView,当启用绘图时,该视图将移动到前面。这意味着控件始终处于活动状态,并且不能在控件区域内进行绘图。

如果要绘制L形工程视图,可以仅通过连接两条线来完成。。就像我创造了一支箭。。如果要在移动(拖动)任何对象时停止绘制。。你只需要在你的touchsmoved方法中应用一个检查(比如is moved,)

以下是绘制箭头的代码(您可以将其用作绘制任何形状的参考):

检查您是否已点击路径的代码(表示您的触点位于贝塞尔路径中)


谢谢-好主意,但不幸的是它不起作用。我不知道在那篇教程发布后的几年里到底发生了什么变化,但在实现了上面所显示的内容之后,我并没有得到预期的效果。我没有在圆角上获得透明度,当我将RoundedRect视图的填充颜色设置为clearColor时,它只会变成黑色-你看不到它下面的任何东西。我正在添加这个RoundedRect视图作为主视图的子视图。我甚至没有尝试过用它实现任何绘图代码。
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;
}