2009-08-17 30 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

相关问题