2012-06-01 185 views
30

鑑於iOS上的任意UIView,有沒有一種使用核心圖形(CAGradientLayer想到)的方式來應用「前景透明」的漸變?UIView透明漸變

我不能使用標準CAGradientLayer,因爲背景比UIColor更復雜。我也不能覆蓋PNG,因爲隨着我的子視圖沿着它的父垂直滾動視圖滾動(參見圖片),背景將會改變。

我有一個非優雅的回退:當父滾動視圖滾動時,讓我的uiview剪輯其子視圖並移動背景的預渲染的漸變png。

transparent uiview gradient problem

+0

的背景是什麼?滾動視圖滾動時它如何「改變」? –

回答

88

這是一個令人尷尬的簡單解決方法:應用一個CAGradientLayer作爲我的子視圖的掩碼。

CAGradientLayer *gradientLayer = [CAGradientLayer layer]; 
gradientLayer.frame = _fileTypeScrollView.bounds; 
gradientLayer.colors = [NSArray arrayWithObjects:(id)[UIColor whiteColor].CGColor, (id)[UIColor clearColor].CGColor, nil]; 
gradientLayer.startPoint = CGPointMake(0.8f, 1.0f); 
gradientLayer.endPoint = CGPointMake(1.0f, 1.0f); 
_fileTypeScrollView.layer.mask = gradientLayer; 

感謝Cocoanetics指着我在正確的方向!

+6

我使用此代碼將梯度添加到非常類似的水平UIScrollView。它看起來很好,但是當你實際上滾動時,從右側進入的視圖是透明的。就好像漸變應用於坐在滾動視圖上的實際視圖,而不是作爲它們上方的圖層。我究竟做錯了什麼? –

+0

這是正確的答案! – Yariv

+0

如何創建一個垂直梯度起訴這段代碼? –

0

我討厭這樣說,但我認爲你是到自定義UIView的土地。我認爲我會嘗試在繪製drawRect例程的自定義UIView中實現它。通過這種方式,你可以擁有該視圖,放置在實際的滾動視圖之上,並且對所有的觸摸事件(即放棄第一響應者)進行梯度視圖(如果你願意的話)「傳遞」。

2

Gradient Example

我只是碰到了同樣的問題,結束了寫我自己的類。這似乎是嚴重的矯枉過正,但這是我能找到的做透明度漸變的唯一途徑。你可以看到我的writeup and code example here

它基本上歸結爲一個自定義UIView創建兩個圖像。一個是純色,另一個是用作圖像蒙版的漸變。從那裏我將結果圖像應用到uiview.layer.content。

我希望它能幫助, 喬

1

這就是我要做的。

步驟1定義自定義梯度視圖(SWIFT 4):

import UIKit 

class GradientView: UIView { 
    override open class var layerClass: AnyClass { 
     return CAGradientLayer.classForCoder() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     let gradientLayer = self.layer as! CAGradientLayer 
     gradientLayer.colors = [ 
      UIColor.white.cgColor, 
      UIColor.init(white: 1, alpha: 0).cgColor 
     ] 
     backgroundColor = UIColor.clear 
    } 
} 

步驟2 - 拖動並在故事板掉落UIView並設置其自定義類來GradientView

enter image description here

作爲一個例子,這是上述梯度視圖的樣子:


https://github.com/yzhong52/GradientViewDemo

+0

沒跟我 – Elsammak

+0

@Elsammak工作,我想那是因爲你沒有設置UIview的背景顏色清除。詳情請參閱Smaily Carrilho的編輯。 –

+1

它確實有效。謝謝。 – kkazakov