2009-08-17 48 views
2

我想寫一個UIView子類,除其他外,爲它下面的某種顏色着色。這是我想出,但遺憾的是似乎並沒有正常工作:如何使子視圖在iPhone上的一部分屏幕上色調?

#import <UIKit/UIKit.h> 

@class MyOtherView; 
@interface MyView : UIView 
{ 
    MyOtherView *subview; 
} 
@end 

@implementation MyView 

- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) { 
     frame.origin.x += 100.0; 
     frame.origin.y += 100.0; 
     frame.size.width = frame.size.height = 200.0; 
     subview = [[MyOtherView alloc] initWithFrame:frame]; 
     [self addSubview:subview]; 
     [subview release]; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect 
{ 
    // Draw a background to test out on 
    UIImage *image = [UIImage imageNamed:@"somepic.png"]; 
    [image drawAtPoint:rect.origin]; 

    const CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    [[UIColor blueColor] setFill]; 
    rect.size.width = rect.size.height = 200.0; 
    CGContextFillRect(ctx, rect); 
} 

@end 

@interface MyOtherView : UIView 
@end 

@implementation MyOtherView 

- (void)drawRect:(CGRect)rect 
{ 
    // This should tint "MyView" but it doesn't. 
    const CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(ctx); 
    CGContextSetBlendMode(ctx, kCGBlendModeScreen); 
    [[UIColor redColor] setFill]; 
    CGContextFillRect(ctx, rect); 
    CGContextRestoreGState(ctx); 
} 

@end 

我想「MyOtherView」色彩的地方重疊「MyView的」紅,而是它只是繪製不透明紅色塊到它上面。但是,如果我從「MyOtherView」複製-drawRect:函數並將其附加到「MyView」中的函數(這讓我非常頭疼終於實現),這似乎工作正常。任何人都知道我在做什麼錯了?是否有可能做到這一點,或者我應該以不同的方式接近它?

+0

您可以使用CALayer獲取此行爲,檢查了這一點http://stackoverflow.com/a/18805190/2567532 – lekksi 2013-09-14 18:52:36

回答

0

我想你是在想這個。將另一個視圖疊加在一起,並將頂視圖的alpha設置爲0.5。您還需要將不透明設置爲NO。

如果您適當地設置了視圖的背景色,您甚至不需要重寫drawRect。

+0

我試過設置阿爾法,但不幸的是我無法得到正確的顏色,更不用說Quartz的任何奇特混合效果了。 對不起,我意識到我可以在這裏使用背景顏色,我只是用它作爲另一種視圖的簡單示例。在我的應用程序中,比這更復雜一點。 – Michael 2009-08-17 06:20:36

+0

我不認爲你可以調整特定視圖的混合模式。也許你可以在一個視圖中使用多個CALayers? – 2009-08-17 15:21:01

0

可能想要退房this SO question

+0

這與我想要的很接近,只有一切都在同一個-drawRect:函數中完成。我如何用不同的視圖來做到這一點? – Michael 2009-08-17 06:23:14

+0

在這個問題中,他們正在爲整個屏幕尋找單一顏色,但那是因爲他們在屏幕上只有一個圖像視圖。只需將相同的技術應用於您想要着色的每個派生視圖。每個子類視圖都有自己的drawRect方法和tint值。它也可以一般應用於UIViews而不是UIImageViews,所以你應該可以將它應用於非圖像圖形。 – Ramin 2009-08-17 15:50:08

相關問題