为啥我不能在 ARC 中使用自定义颜色创建 CAGradientLayer?

Posted

技术标签:

【中文标题】为啥我不能在 ARC 中使用自定义颜色创建 CAGradientLayer?【英文标题】:Why can't I create a CAGradientLayer using custom colors in ARC?为什么我不能在 ARC 中使用自定义颜色创建 CAGradientLayer? 【发布时间】:2013-10-28 18:39:22 【问题描述】:

在我的表格视图控制器的以下代码中,如果我使用像 [UIColor blueColor] 这样的“库存”颜色,它可以正常工作,但是如果我尝试使用 RGBA 值创建自定义颜色,它会严重失败并且不会绘制任何东西但纯黑色。

这是因为 ARC 在 CGColorRef 可以使用之前释放了它吗?我怎样才能让它与自定义颜色一起使用?

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
    [cell setBackgroundColor:[UIColor clearColor]];

    CAGradientLayer *selectedGrad = [CAGradientLayer layer];
    selectedGrad.frame = cell.bounds;

    UIColor* colorOne = [UIColor blueColor];//[UIColor colorWithRed:96/255 green:157/255 blue:227/255 alpha:1];
    UIColor* colorTwo = [UIColor greenColor];//[UIColor colorWithRed:54/255 green:123/255 blue:201/255 alpha:1];

    NSArray* colors = [NSArray arrayWithObjects:(id)colorOne.CGColor, colorTwo.CGColor, nil];

    selectedGrad.colors = colors;
    selectedGrad.locations = [NSArray arrayWithObjects:@(0.0), @(1.0), nil];

    [cell setSelectedBackgroundView:[[UIView alloc] init]];
    [cell.selectedBackgroundView.layer insertSublayer:selectedGrad atIndex:0];

【问题讨论】:

作为健全性检查,确保cell.selectedBackgroundView 在设置后不为零。 【参考方案1】:

问题在于,当您执行96/255 时,它会将值解释为 int,结果为 0

在创建 UIColor 时尝试将值写入96.0/255.0

【讨论】:

阿格。我认为编译器会更聪明。 :/ 我猜我太习惯于使用 javascript/C#了。【参考方案2】:

这是添加 RGB 颜色的正确方法:

 [UIColor colorWithRed:0x63/255.0 green:0x4E/255.0 blue:0x42/255.0 alpha:1]

【讨论】:

以上是关于为啥我不能在 ARC 中使用自定义颜色创建 CAGradientLayer?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能使用 RuntimeException 而不是创建自定义异常? [复制]

为啥我不能禁用 ARC(每个单个文件)?

为啥我的 ViewController 在第二次调用后才发布,iOS ARC?

为啥我不能在 ormlite 中使用自定义 DAO 类?

POI 使用XSSF导出Excel自定义单元格颜色为啥始终是黑色的?代码如下

为啥我不能在 react native 中导入我的自定义组件