如何删除或禁用UIView的一部分?

时间:2012-01-05 10:06:27

标签: ios uiview uibezierpath

我有一个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”形图纸视图? 要么 剪下图纸视图的一部分,以便用户可以与其背后的内容进行互动? 要么 在图纸视图的顶部施加一个区域,我可以禁用绘图并添加我的控件?

3 个答案:

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