iPhone - Нарисуйте прозрачный прямоугольник на UIView, чтобы показать вид внизу - PullRequest
38 голосов
/ 27 сентября 2010

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

Ответы [ 4 ]

75 голосов
/ 27 сентября 2010

Вы должны переопределить метод 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's an ivar somewhere called holeRect of type CGRect
    // We could just fill holeRect, but it's more efficient to only fill the
    // area we're being asked to draw.
    CGRect holeRectIntersection = CGRectIntersection( holeRect, rect );

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

Если вы используете Интерфейсный конструктор, обязательно измените класс представления дырки на HoleyView. Вы можете сделать это, выбрав в представлении в Интерфейсном Разработчике и выбрав панель «Удостоверение» в Инспекторе (в правом нижнем углу - значок «i»).

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

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

Если вы хотите сделать круги, вы должны использовать Core Graphics (он же 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 );
    }
}
35 голосов
/ 10 мая 2012

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

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

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

17 голосов
/ 04 июля 2011

чтобы нарисовать эллипс вместо прямоугольника, просто установите blendMode в значение clear:

- (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 );
}
1 голос
/ 27 сентября 2010

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

(ответ Жака только что высветился - мне это нравится)

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

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

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

...