我們的 APP 有一個這樣的畫面,它有這幾點需求:

  • 要顯示文字描述在圖片上
  • 文字描述的背景是漸層色
  • 因為文字長度不同,所以漸層的高度也不同

最常見的作法

很直覺反應的,我在圖片上加了一個 UIView 當作 overlay,再放上 UILabel 顯示文字,然後在 overlay 插入一個 CAGradientLayer 顯示漸層 layer。這的確是可行的作法,也是網路上很常見的「建立漸層 View」的作法。只是一來我們得額外建立一個 layer,二來得想辦法讓 layer 隨著 overlay 調整尺寸,處理這些細節的程式碼有點不漂亮。

利用 layerClass

後來我發現 UIView 有個 + (Class)layerClass method 可以用,在預設的情況下,UIView 的背後其實是一個 CALayer,透過 override 這個 method,我們可以讓它變成其他的 layer,在這裡我要把它變成 CAGradientLayer。具體作法如下:

@implementation OverlayView
+ (Class)layerClass {
  return [CAGradientLayer class];
}

- (instancetype)initWithFrame:(CGRect)frame {
  if (self = [super initWithFrame:frame]) {
    CAGradientLayer *layer = (CAGradientLayer *)self.layer;
    UIColor *lightColor = [UIColor clearColor];
    UIColor *middleColor = [UIColor colorWithWhite:0 alpha:0.35];
    UIColor *anotherColor = [UIColor colorWithWhite:0 alpha:0.65];
    UIColor *darkColor = [UIColor colorWithWhite:0 alpha:0.8];
    layer.colors = @[(id)lightColor.CGColor, (id)middleColor.CGColor, (id)anotherColor.CGColor, (id)darkColor.CGColor];
    layer.locations = @[@(0), @(0.2), @(0.65), @(1)];
  }
  return self;
}
@end