Горизонтальный CAGradientLayer в iOS 7.0
Внутри приложения я использую CAGradientLayer
для установки фона моей ячейки следующим образом:
retValue = [tableView dequeueReusableCellWithIdentifier:@"Cells" forIndexPath:indexPath];
UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor blueColor];
bgColorView.layer.masksToBounds = YES;
id startColor = (id)[[UIColor colorWithWhite:0.75 alpha:1] CGColor];
id endColor = (id)[[UIColor blueColor] CGColor];
CAGradientLayer* gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = retValue.contentView.bounds;
gradientLayer.colors = @[startColor,startColor,endColor,endColor];
gradientLayer.locations = @[[NSNumber numberWithFloat:0],
[NSNumber numberWithFloat:0.95],
[NSNumber numberWithFloat:0.95],
[NSNumber numberWithFloat:1]];
[gradientLayer setStartPoint:CGPointMake(0,0.5)];
[gradientLayer setEndPoint:CGPointMake(1,0.5)];
[bgColorView.layer addSublayer:gradientLayer];
retValue.selectedBackgroundView = bgColorView;
(этот код внутри - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
)
Он отлично работает на iOS 6, но не работает на iOS 7, в новом iOS градиент всегда вертикален (startPoint и endPoint игнорируются)
Кто-нибудь сталкивался в той же проблеме?
Спасибо,
Перри
Ответы
Ответ 1
Эти вопросы довольно старые, но я столкнулся с этим, так что другие, вероятно, тоже будут. Следующий код будет генерировать горизонтальный градиент на симуляторе iPhone с версией 7.0.3
+ (void)drawGradientOverContainer:(UIView *)container
{
UIColor *transBgColor = [UIColor colorWithWhite:1.0 alpha:0.0];
UIColor *black = [UIColor blackColor];
CAGradientLayer *maskLayer = [CAGradientLayer layer];
maskLayer.opacity = 0.8;
maskLayer.colors = [NSArray arrayWithObjects:(id)black.CGColor,
(id)transBgColor.CGColor, (id)transBgColor.CGColor, (id)black.CGColor, nil];
// Hoizontal - commenting these two lines will make the gradient veritcal
maskLayer.startPoint = CGPointMake(0.0, 0.5);
maskLayer.endPoint = CGPointMake(1.0, 0.5);
NSNumber *gradTopStart = [NSNumber numberWithFloat:0.0];
NSNumber *gradTopEnd = [NSNumber numberWithFloat:0.4];
NSNumber *gradBottomStart = [NSNumber numberWithFloat:0.6];
NSNumber *gradBottomEnd = [NSNumber numberWithFloat:1.0];
maskLayer.locations = @[gradTopStart, gradTopEnd, gradBottomStart, gradBottomEnd];
maskLayer.bounds = container.bounds;
maskLayer.anchorPoint = CGPointZero;
[container.layer addSublayer:maskLayer];
}
Я не уверен, почему ваш код не работает, но я получаю странное поведение, если я не устанавливаю опорную точку - хотя градиент все еще горизонтальный. Возможно, это связано с тем, что это представление ячейки - вы можете попробовать применить градиент к базовой таблице.
Ответ 2
Просто наткнулся на это сейчас, через 3 года. Спасибо, Горд за это решение. Здесь он находится в Swift 3.0:
func drawGradientOver(container: UIView) {
let transBgColor = UIColor.clear
let black = UIColor.black
let maskLayer = CAGradientLayer()
maskLayer.opacity = 0.8
maskLayer.colors = [black.cgColor, transBgColor.cgColor, transBgColor.cgColor, black.cgColor]
// Hoizontal - commenting these two lines will make the gradient veritcal
maskLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
maskLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
let gradTopStart = NSNumber(value: 0.0)
let gradTopEnd = NSNumber(value: 0.4)
let gradBottomStart = NSNumber(value: 0.6)
let gradBottomEnd = NSNumber(value: 1.0)
maskLayer.locations = [gradTopStart, gradTopEnd, gradBottomStart, gradBottomEnd]
maskLayer.bounds = container.bounds
maskLayer.anchorPoint = CGPoint.zero
container.layer.addSublayer(maskLayer)
}