Ios 如何剪切或禁用UIView的一部分?
我有一个自定义的UIView子类LineDrawingView。我在主视图控制器中将其作为@属性,并将其添加到视图中。这很好-它在当前视图的顶部创建一个透明视图,并使用UIBezierPath、ToucheSBegind、touchesMoved等,因此您可以通过拖动手指来绘制整个视图 我需要使该工程视图为“L”形,这样我就可以在左下角有一个区域,其中有各种控件。除了添加两个单独的矩形工程视图外,我想不出任何方法使工程视图成为“L”形,但这不起作用,因为当您将手指从一个矩形拖动到另一个矩形时,触摸会中断。我提出的另一个解决方案是在工程视图的顶部添加另一个视图。此视图应防止绘制,并且我还可以在其中定位控件,以便在启用绘制时它们仍然可用 我尝试创建UIView并将其添加为工程视图的子视图。我给它上色,这样我就可以检查它是否在正确的地方。我本以为这会阻止在新UIView区域内绘制,但在LineDrawingView的整个区域内都会继续绘制。我还尝试在索引2处插入新的UIView,在索引1处插入LineDrawingView。它仍然没有影响绘图Ios 如何剪切或禁用UIView的一部分?,ios,uiview,uibezierpath,Ios,Uiview,Uibezierpath,我有一个自定义的UIView子类LineDrawingView。我在主视图控制器中将其作为@属性,并将其添加到视图中。这很好-它在当前视图的顶部创建一个透明视图,并使用UIBezierPath、ToucheSBegind、touchesMoved等,因此您可以通过拖动手指来绘制整个视图 我需要使该工程视图为“L”形,这样我就可以在左下角有一个区域,其中有各种控件。除了添加两个单独的矩形工程视图外,我想不出任何方法使工程视图成为“L”形,但这不起作用,因为当您将手指从一个矩形拖动到另一个矩形时,触
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;
}