2012-03-20 37 views
1

在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

+0

如果你打算-1被裁減掉,投票結束,至少張貼爲什麼。 – Bot 2012-03-21 01:34:23

回答

0

@ 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

這聽起來像它可以工作。當我有一些時刻我會嘗試。 – Bot 2012-03-21 15:08:58

0

我覺得內置的日曆應用擠壓爲你做到這一點發生在非常相同的開始時間的瓷磚,但同時也擠壓磚,其時間重疊,也就是說,如果的開始時間後面的圖塊位於早期圖塊的開始和結束時間之間。

但是,如果您需要用戶界面來重疊繪製這些瓦片,則無法繞過它:被遮擋的瓦片需要知道它在下面(從開始到重疊),並且需要隱藏其標籤或減少他們的alpha級別。

+0

隱藏標籤並不是Apple如何做到的。正如您從截圖中可以看出的那樣,您可以看到上半部分的字母。如果蘋果公司只是改變了標籤尺寸以匹配前部瓷磚的頂部。 – Bot 2012-03-20 21:00:24

0

如何在兩個盒子之間添加UIView?這個中間的UIView會掩蓋字母(並且與後面的事件具有相同的背景顏色),從而解決了您的問題:沒有文字通過,但您會看到另一個標籤背後的顏色!

您可能能夠使用UILabel的框架屬性以及最前面的日曆約會的frame屬性創建frameUIView

+0

UIView必須是透明的,所以你可以看到它們下面的小時線。 – Bot 2012-03-20 21:15:50