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

答えて

0

あなたはこれを過度に考えていると思います。一方のビューを他方のビューにオーバーレイし、トップビューのアルファを0.5に設定します。 opaqueをNOに設定する必要もあります。

ビューの背景色を適切に設定すると、drawRectをオーバーライドする必要もありません。

+0

私はアルファを設定しようとしましたが、残念ながら正しい色を得ることができません。 Quartzの素晴らしいブレンド効果はもちろんのこと、 申し訳ありませんが、私はここで背景色を使うことができたことを知っています。別の表示を着色する単純な例として使用していました。私のアプリではそれより少し複雑です。 – Michael

+0

特定のビューのブレンドモードを調整することはできません。 1つのビュー内で複数のCALayersを使用できますか? –

0

チェックアウトしたい場合がありますthis SO question

+0

これは私が望むものに近いですが、すべてが同じ-drawRect:関数で行われています。どのように私は別のビューでこれを行うのですか? – Michael

+0

その質問では、画面全体で単一の色を探していましたが、それは画面上に1つの画像しか表示されなかったからです。色付けしたいそれぞれの派生ビューに同じテクニックを適用するだけです。すべてのサブクラス化されたビューは、独自のdrawRectメソッドと色合い値を取得します。 UIImageViewsの代わりにUIViewに一般的に適用することもできるので、非画像グラフィックスにも同様に適用できるはずです。 – Ramin

関連する問題