Как вырезать или отключить раздел UIView? - PullRequest
0 голосов
/ 05 января 2012

У меня есть собственный подкласс UIView, LineDrawingView. Я имею это как @property в моем главном контроллере представления, и я добавляю это к представлению. Это прекрасно работает - он создает прозрачный вид поверх текущего вида и использует UIBezierPath, touchesBegan, touchesMoved и т. Д., Поэтому вы можете рисовать по всему виду, перетаскивая палец.

Мне нужно сделать этот чертежный вид "L" в форме, чтобы у меня была область в левом нижнем углу, где расположены различные элементы управления. Я не могу придумать способ сделать вид чертежа "L" в форме, за исключением, может быть, добавления двух отдельных прямоугольных видов чертежа, но это не работает, потому что касания прерываются, когда вы перетаскиваете палец из одного прямоугольника в другой. Другое решение, которое я придумала, это добавить другой вид поверх вида чертежа. Этот вид должен предотвращать рисование, и я мог бы также найти в нем свои элементы управления, чтобы они могли использоваться во время рисования.

Я попытался создать UIView и добавить его в качестве подпредставления вида чертежа. Я дал ему оттенок, чтобы я мог проверить, что он присутствует и находится в нужном месте. Я ожидал, что это предотвратит рисование в области нового UIView, но рисование продолжается по всей области LineDrawingView. Я также попытался вставить новый UIView в индекс 2, с LineDrawingView, вставленный в индекс 1. Это все еще не влияло на рисунок.

    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 ]

1 голос
/ 05 января 2012

Вот учебник по созданию прозрачного скругленного прямоугольника UIView , который, я думаю, вы могли бы изменить простым способом, чтобы придать ему форму L.

Самое важное, что нужно сохранить вИмейте в виду, что вам придется реализовать свои собственные drawRect, и я считаю, что также ваши собственные hitTest или касания (например, обработка событий, такие как touchedBegan:withEvent:).

0 голосов
/ 06 мая 2013

Если вы хотите нарисовать чертеж в виде буквы L, вы можете сделать это, объединив только две линии ... точно так же, как я создал стрелку ... и если вы хотите остановить рисование, когда вы перемещаете (перетаскиваете) любой объект.. вам просто нужно применить проверку в вашем методе перемещений прикосновений (как перемещено,) ..

вот код для рисования стрелки (вы можете использовать его как ссылку для рисования любой формы): Как нарисовать стрелку, используя 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;
}
0 голосов
/ 14 февраля 2012

Я связался с Apple по этому поводу. Оказывается, нет способа создать представление в форме буквы "L". Решение состояло в том, чтобы на чертежном виде проверить, находятся ли касания в запрещенной зоне, и, если это так, предотвратить рисование линии. Мои элементы управления были перемещены в отдельный UIView, который перемещается вперед, когда включено рисование. Это означает, что элементы управления остаются активными все время, и рисование не может происходить в области элементов управления.

...