【发布时间】:2015-05-14 22:17:58
【问题描述】:
有谁知道如何向 uitableviewcell 或 uiimageview 的底部添加渐变,如下图所示?
【问题讨论】:
-
创建一个具有透明和半透明区域的 CAGradientLayer。然后将单元格的 contentView 的图层蒙版设置为这个渐变图层。
标签: ios objective-c swift uiimageview gradient
有谁知道如何向 uitableviewcell 或 uiimageview 的底部添加渐变,如下图所示?
【问题讨论】:
标签: ios objective-c swift uiimageview gradient
将此类添加到您的项目中 (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 类设为这个类,而不是默认类。
【讨论】:
func addGradientLayer() 是否只在初始化函数上被调用,并且您已经检查过您没有错过任何一行。 (你是在翻译成 Objective-C 吗?)