Подтвердить что ты не робот

IPhone - Нарисуйте прозрачный прямоугольник на UIView, чтобы открыть вид внизу

В настоящее время у меня есть два UIViews: один из красного фона и другой синий. Голубой вид является подпунктом красного представления. То, что я хотел бы сделать, - это "вырезать" прямоугольники на синем изображении, чтобы можно было видеть красный вид. Как вы это делаете?

4b9b3361

Ответ 1

Вы должны переопределить метод верхнего уровня drawRect. Например, вы можете создать класс HoleyView, который происходит от UIView (вы можете сделать это, добавив в проект новый файл, выбрав подкласс Objective-C и установив "Подкласс" в UIView)., В HoleyView, drawRect будет выглядеть примерно так:

- (void)drawRect:(CGRect)rect {
    // Start by filling the area with the blue color
    [[UIColor blueColor] setFill];
    UIRectFill( rect );

    // Assume that there an ivar somewhere called holeRect of type CGRect
    // We could just fill holeRect, but it more efficient to only fill the
    // area we're being asked to draw.
    CGRect holeRectIntersection = CGRectIntersection( holeRect, rect );

    [[UIColor clearColor] setFill];
    UIRectFill( holeRectIntersection );
}

Если вы используете построитель интерфейса, не забудьте изменить класс дырявого вида на HoleyView. Вы можете сделать это, выбрав в представлении в Interface Builder и выбрав панель "Идентификация" в инспекторе (ее справа от иконки "i" ).

Вы также должны установить верхний вид как непрозрачный либо со следующим фрагментом кода, либо путем проверки флажка Opaque в свойствах вида в Interface Builder (вы найдете его в разделе "Вид" атрибутов вида) и установите его непрозрачность фона на 0% (цвет фона установлен в том же разделе).

topView.opaque = NO;
topView.backgroundColor = [UIColor clearColor];

Если вы хотите делать круги, вы должны использовать Core Graphics (aka Quartz 2D). Возможно, вам захочется прочитать руководство по программированию, которое доступно здесь.

Чтобы нарисовать эллипс вместо прямоугольника, ваш drawRect будет выглядеть примерно так:

- (void)drawRect:(CGRect)rect {
    // Get the current graphics context
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor( context, [UIColor blueColor].CGColor );
    CGContextFillRect( context, rect );

    if( CGRectIntersectsRect( holeRect, rect ) )
    {
        CGContextSetFillColorWithColor( context, [UIColor clearColor].CGColor );
        CGContextFillEllipseInRect( context, holeRect );
    }
}

Ответ 2

Во всех других ответах есть истина, но можно рисовать с четким цветом, или, таким образом, стереть существующие цвета в любом пути, даже с - [UIBezierPath fill] или аналогичные методы удобства. Все, что вам нужно сделать, - установить режим контекстного смешивания на соответствующее значение в зависимости от эффекта, который вы пытаетесь достичь, например:

CGContextSetBlendMode(context, kCGBlendModeClear);
[[UIColor clearColor] set];
[myArbitraryPolygonPath fill];

Есть около двух десятков различных вариантов, которые вы можете выбрать, взгляните на ссылку CGContext.

Ответ 3

для рисования эллипса вместо прямоугольника просто установите blendMode для очистки:

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor( context, [UIColor blackColor].CGColor );
    CGContextFillRect( context, rect );

    CGRect holeRectIntersection = CGRectIntersection( holeRect, rect );

    CGContextSetFillColorWithColor( context, [UIColor clearColor].CGColor );
    CGContextSetBlendMode(context, kCGBlendModeClear);

    CGContextFillEllipseInRect( context, holeRect );
}

Ответ 4

Это могут быть глупые пути, но я бы не сделал этого так, как вы описываете, но заставьте его выглядеть так, как вы хотите, чтобы он выглядел.

(ответ Жака только что появился - выглядит хорошо для меня)

Подход 1: В контроллере представления для создания списка прямоугольников, которые чередуются вокруг открытой "дыры". По мере увеличения числа ваших отверстий количество перегородок также увеличится.

Подход 2: Обрати свое мышление. Синий вид должен быть сзади, с краями, расположенными сверху. Вы по-прежнему видите красный вид со всеми, кроме "отверстий", замаскированных синим представлением, но то, что вы действительно делаете, - это копирование областей из представления, которое вы хотите выставить, и помещая их поверх маски, когда вы делаете каждое отверстие. Если у вас есть какой-то эффект, имитирующий глубину, вы можете добавить это, как требуется, с каждым отверстием.

Ни один из них не требует подкласса или drawRect:.