【问题标题】:Add shade gradient to the bottom of a uitableviewcell / uiimageview将阴影渐变添加到 uitableviewcell / uiimageview 的底部
【发布时间】:2015-05-14 22:17:58
【问题描述】:

有谁知道如何向 uitableviewcell 或 uiimageview 的底部添加渐变,如下图所示?

【问题讨论】:

  • 创建一个具有透明和半透明区域的 CAGradientLayer。然后将单元格的 contentView 的图层蒙版设置为这个渐变图层。

标签: ios objective-c swift uiimageview gradient


【解决方案1】:

将此类添加到您的项目中 (swift):

class UIGradientImageView: UIImageView {

let myGradientLayer: CAGradientLayer

 override init?(frame: CGRect){
    myGradientLayer = CAGradientLayer()
    super.init(frame: frame)
    self.setup()
    addGradientLayer()
 }

 func addGradientLayer(){
    if myGradientLayer.superlayer == nil{
        self.layer.addSublayer(myGradientLayer)
    }
 }

 required init(coder aDecoder: NSCoder){
    myGradientLayer = CAGradientLayer()
    super.init(coder: aDecoder)
    self.setup()
    addGradientLayer()
 }

 func getColors() -> [CGColorRef] {
    return [UIColor.clearColor().CGColor, UIColor(red: 0, green: 0, blue: 0, alpha: 0.5).CGColor]
 }

 func getLocations() -> [CGFloat]{
    return [0.5,  0.9]
 }

 func setup() {
     myGradientLayer.startPoint = CGPoint(x: 0.5, y: 0)
     myGradientLayer.endPoint = CGPoint(x: 0.5, y: 1)
    
     let colors = getColors()
     myGradientLayer.colors = colors
     myGradientLayer.opaque = false
     myGradientLayer.locations = getLocations()
 }

 override func layoutSubviews() {
    super.layoutSubviews()
    myGradientLayer.frame = self.layer.bounds
 }
}

更新:Objective-C 翻译的解决方案。感谢@SleepsOnNewspapers。

 #import "UIGradientImageView.h"

 @interface UIGradientImageView()

  @property (nonatomic, strong) CAGradientLayer *myGradientLayer;

 @end

 @implementation UIGradientImageView

 -(instancetype)initWithFrame:(CGRect)frame{

 if(self){
  self = [super initWithFrame:frame];
  self.myGradientLayer = [[CAGradientLayer alloc]init];
  [self setup];
  [self addGradientLayer];
  }
 return self;
 }

 -(instancetype)initWithCoder:(NSCoder *)aDecoder{

 if(self){
   self = [super initWithCoder:aDecoder];
   self.myGradientLayer = [[CAGradientLayer alloc]init];
   [self setup];
   [self addGradientLayer];
  }
  return self;
 }

 -(void)addGradientLayer{
 if (self.myGradientLayer.superlayer == nil) {
  [self.layer addSublayer:self.myGradientLayer];
 }
}

将情节提要上的 UIImageView 类设为这个类,而不是默认类。

【讨论】:

  • 这个和CGGradientLayer有什么区别吗?这在目标 c 中的实现也有很大不同吗?
  • ..应该类似。只需从 swift 翻译到 Objective-C,一切都可用。
  • 此代码不起作用。它没有考虑到 uitableviewcells 被重绘
  • 不管怎样,检查func addGradientLayer() 是否只在初始化函数上被调用,并且您已经检查过您没有错过任何一行。 (你是在翻译成 Objective-C 吗?)
  • @SleepsOnNewspapers 我添加了您的解决方案作为对此答案的更新,我正在考虑将其添加为另一个答案,但其基础是相同的答案,只是这个答案被翻译为 Objective-C,也,如果为您的解决方案赚取积分,我会感到难过:)
猜你喜欢
  • 2013-04-25
  • 1970-01-01
  • 2011-11-11
  • 2019-01-17
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多