2012-01-05 35 views
0

我有一个UIView,LineDrawingView的自定义子类。我把它作为@property在我的主视图控制器中,并将其添加到视图中。这工作正常 - 它在当前视图的顶部创建一个透明的视图,并使用UIBezierPath,touchesBegan,touchesMoved等,以便您可以通过拖动手指四处绘制所有视图。如何删除或禁用UIView的一部分?

我需要使该图形视图“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” 形拉丝看法? OR 剪出图纸视图,以便用户可以与背后是什么互动的一部分? OR 在图纸视图在那里我可以禁用绘图,并添加我的控件的顶部强加一个区域?

回答

0

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

1

Here is a tutorial on creating a transparent rounded rectangle UIView,我想你可以用简单的方式修改,使之呈L形。

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

+0

谢谢 - 好主意,但不幸的是它不起作用。我不知道在教程发布后的几年中发生了什么变化,但是在实现那里显示的内容后,我没有得到期望的效果。我没有在圆角上获得透明度,当我将RoundedRect视图的填充颜色设置为clearColor时,它只是变成黑色 - 您看不到它下面的任何东西。我将这个RoundedRect视图添加为我的主视图的子视图。我甚至没有尝试过使用任何绘图代码。 – beev 2012-01-05 18:29:30

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; 
}