2011-01-31 15 views
3

我們的主要UIView是一個帶有固定背景圖像的UIScrollView(很明顯,很明顯)。在該scrollView中,我們有幾個UIViews用於保存內容並隨着用戶滾動(也是普通的)而上下滾動。那些UIViews每個都有自己的背景,簡單的漸變從白色到黑色。如何在UIView上使用滾動到固定背景上的CGBlendMode?

目標是讓這些(內部)UIViews的背景漸變部分不透明,並使用除「kCGBlendModeNormal」(特別是,「kCGBlendModeOverlay」)以外的CGBlendMode。當UIViews在其上方向上和向下滾動時,您應該能夠看到「父」scrollView的固定背景圖像。

- (void)drawRect:(CGRect)rect { 
    gradientStart = [UIColor colorWithRed:1 green:1 blue:1 alpha:1.0]; 
    gradientEnd = [UIColor colorWithRed:0 green:0 blue:0 alpha:1.0]; 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGFloat locations[2] = { 0.0f, 1.0f }; 
    NSArray *colors = [NSArray arrayWithObjects:(id)gradientStart.CGColor, (id)gradientEnd.CGColor, nil]; 

    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef)colors, locations); 
    CGColorSpaceRelease(colorSpace); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSetAlpha(context, 0.50); //this works! 
    CGContextSetBlendMode(context, kCGBlendModeOverlay); //doesn’t seem to do anything! 

    CGContextClearRect(context, rect); 

    CGPoint startPoint, endPoint; 
    startPoint.x = 0.0; 
    startPoint.y = 0.0; 
    endPoint.x = 0.0; 
    endPoint.y = rect.size.height; 

    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0); 

    CGGradientRelease(gradient); 

    [super drawRect:rect]; 
} 

除了被忽略的CGContextSetBlendMode之外,一切都按預期工作。我們似乎無法找到一種方法來改變UIView的blendMode相對於它背後的東西,就像你使用alpha的方式一樣。請注意,這與在SINGLE UIView中構建多個圖層不同;在這種情況下,這種技術確實會將圖層的blendMode更改爲「頂部」。我們希望看到父scrollView的固定背景圖像(當我們向上和向下滾動子視圖時),同時應用alpha和overlay混合。

這裏的顯示問題的圖像:在您的幫助http://img2.sbck.us/blendmode.png

謝謝!

回答

4

我相信你想要的東西是不可能與您當前的設置。在iOS上,視圖的混合模式根本無法對視圖下繪製的內容產生影響。您必須在同一視圖中繪製滾動視圖的背景和漸變。

+0

我們的證據肯定會與您同意,但我們希望我們錯過了一些東西。對我來說,任何可以用alpha完成的事情都應該可以通過blendMode完成。它們結合起來定義「前景像素如何與背景像素混合」。但這並不意味着它按照它應該的方式工作。 – 2011-02-01 01:12:21

0

好像你可以通過設置你的視圖的CALayer的'compositingFilter'屬性來做到這一點。 CALayer.h中的評論說:「過濾器對象用於將圖層與其(可能已過濾)背景進行合成,默認值爲零,這意味着源代碼合成。」

唉,提供過濾器的CoreImage在iOS上沒有(正式)可用。

我想你的另一種選擇是使用OpenGL。通過將UIView渲染成可用於紋理的圖像,您仍然可以在使用OpenGL之後使用UIView。

2

這是可能的,至少有兩個圖像視圖。甚至可以用更一般的觀點。該方法是在父視圖中執行drawRect,並執行如下操作:

  1. 確定前景視圖的矩形。
  2. 將前景視圖中的矩形轉換爲背景視圖中的矩形。
  3. 開始一個新的圖形上下文。
  4. 用適當的混合模式繪製背景。
  5. 用正確的混合模式繪製前景。
  6. 從圖形上下文中提取圖像。
  7. 結束圖形上下文。
  8. 相應地使用提取的圖像。

這允許前景圖像與背景圖像混合。