Сделать вид прозрачным, не видя текст снизу - PullRequest
1 голос
/ 21 марта 2012

В приложении календаря iPhone, если у вас есть 2 плитки, накладывающиеся друг на друга, текст из нижней плитки обрезается и не виден через верхнюю прозрачную плитку.Как бы я мог сохранить прозрачность плиток, но не показывать текст от нижних плиток до верхних плиток?

Вот мой код

APCalendarDayTile *tile = (APCalendarDayTile *)view;
CGFloat startPos = [APCalendarCurrentDayView yAxisForTime:[APCalendarCurrentDayView minutesToTime:tile.appointment.startDate]];
CGFloat endPos = [APCalendarCurrentDayView yAxisForTime:[APCalendarCurrentDayView minutesToTime:tile.appointment.endDate]];
tile.frame = CGRectMake(kLeftSideBuffer, startPos, (self.bounds.size.width - kLeftSideBuffer - kRightSideBuffer) , endPos - startPos);
tile.backgroundColor = [UIColor colorWithHexString:tile.appointment.appointmentColor]; <-- This also sets the alpha that makes it transparent.
tile.layer.borderColor = [UIColor colorWithHexString:tile.appointment.appointmentColor alpha:1.0].CGColor;
tile.layer.borderWidth = 1.0f;

Код плитки

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        CALayer *layer = [self layer];
        [layer setMasksToBounds:YES];
        [layer setCornerRadius:kCornerRadius];
    }
    return self;
}

- (id)init
{
    if (self = [super init]) {
        self.clipsToBounds = YES;
        self.userInteractionEnabled = YES;
        self.multipleTouchEnabled = NO;

        tileTitle = [[UILabel alloc] init];
        tileTitle.textColor = [UIColor blackColor];
        tileTitle.backgroundColor = [UIColor clearColor];
        tileTitle.font = [UIFont boldSystemFontOfSize:13.0f];
        [tileTitle setAutoresizesSubviews:YES];
        [tileTitle setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];


        tileDescription = [[UILabel alloc] init];
        tileDescription.textColor = [UIColor blackColor];
        tileDescription.backgroundColor = [UIColor clearColor];
        tileDescription.font = [UIFont systemFontOfSize:11.0f];
        tileDescription.lineBreakMode = UILineBreakModeTailTruncation;
        [tileDescription setAutoresizesSubviews:YES];
        [tileDescription setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];


        [self setAutoresizesSubviews:YES];
        [self setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];


        [self addSubview:tileTitle];
        [self addSubview:tileDescription];
    }

    return self;
}

- (void)layoutSubviews
{
    CGRect myBounds = self.bounds;
    CGSize stringSize = [tileTitle.text sizeWithFont:tileTitle.font];

    if (myBounds.size.height <= 22.0) {
        tileTitle.frame = CGRectMake(3, 0, myBounds.size.width, stringSize.height);
        tileDescription.frame = CGRectMake(stringSize.width + 6, -1, myBounds.size.width, 14);
    } else {
        tileTitle.frame = CGRectMake(3, 0, myBounds.size.width, stringSize.height);
        tileDescription.frame = CGRectMake(5, tileTitle.frame.size.height, myBounds.size.width, 14);
    }
}

Мне бы хотелось, чтобы текст на этой фотографии не отображался на лицевой плитке, как вторая фотография.

enter image description here

enter image description here

Ответы [ 3 ]

0 голосов
/ 21 марта 2012

Как насчет добавления UIView между двумя полями? Эта середина UIView будет скрывать буквы (и будет иметь тот же цвет фона, что и заднее событие), что решит вашу проблему: текст не будет проходить, но вы увидите цвет позади другой метки!

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

0 голосов
/ 21 марта 2012

@ user1272965 правильно, поскольку каждая плитка должна знать, какие плитки находятся над ней, тогда вы можете получить нужный текстовый эффект, сделав виды листов пользовательским подклассом и реализовав их рисунок вручную:

Каждая плитка должна иметь доступ к плиткам, которые находятся над ней (или, по крайней мере, к их рамкам):

NSInteger tileCount = [tilesAboveMine count];
CGRect framesAboveMine[tileCount];

for (int i=0; i<tileCount; i++) {
    framesAboveMine[i] = [tilesAboveMine objectAtIndex:i].frame;
}

В drawRect вашего вида плитки нарисуйте плитку, а затем нарисуйте текст, обрезанный видами сверху:

// draw aspects of the tile not to be clipped, like the background image.
// the setup for clipping:

CGContextClipToRects(context, framesAboveMine, tileCount);

затем нарисуйте текст, который будет обрезан по рамкам выше

[myCalendarString drawAtPoint:CGPointMake(10,10)];
0 голосов
/ 21 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...