我有一个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”形图纸视图? 要么 剪下图纸视图的一部分,以便用户可以与其背后的内容进行互动? 要么 在图纸视图的顶部施加一个区域,我可以禁用绘图并添加我的控件?
答案 0 :(得分:1)
Here is a tutorial on creating a transparent rounded rectangle UIView,我认为你可以直接修改它以使其成为L形。
最重要的是要记住,你必须实现自己的drawRect
,我也相信你自己的hitTest
或触摸(例如touchedBegan:withEvent:
之类的事件处理)方法
答案 1 :(得分:0)
我联系了Apple这件事。事实证明,没有办法创造一个“L”形的视图。解决方案是在图纸视图中测试触摸是否在禁区内,如果是,则防止绘制线。我的控件已移动到单独的UIView,当启用绘图时,该UIView将移动到前面。这意味着控件在整个时间内保持活动状态,并且不能在控件区域内进行绘图。
答案 2 :(得分:0)
如果你想绘制一个L形状的绘图视图,你可以通过连接两条线来完成这个...就像我创建了一个箭头一样..如果你想在移动(拖动)任何对象时停止绘图。你只需要在你的触摸移动方法中应用一个检查(就像被移动一样)..
这里是绘制箭头的代码(您可以将其用作绘制任何形状的参考):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;
}