gpt4 book ai didi

ios - CGContextSetShadowWithColor没有显示在设备上

转载 作者:行者123 更新时间:2023-12-01 18:24:18 25 4
gpt4 key购买 nike

我有一个自定义UIView,它是一个带有圆角的矩形,阴影和小边框。

- (void) drawRect:(CGRect)rect {
//// General Declarations
CGContextRef context = UIGraphicsGetCurrentContext();

//// Shadow Declarations
CGColorRef shadow = [UIColor colorWithRed:0.0/255.0 green:0.0/255.0 blue:0.0/255.0 alpha:0.3].CGColor;
CGSize shadowOffset = CGSizeMake(0, 1);
CGFloat shadowBlurRadius = 2;

//// Abstracted Graphic Attributes
CGRect roundedRectangleFrame = CGRectMake(2, 0, rect.size.width - 4, rect.size.height - 2);


//// Rounded Rectangle Drawing
UIBezierPath* roundedRectanglePath = [UIBezierPath bezierPathWithRoundedRect: roundedRectangleFrame cornerRadius: 2];
CGContextSaveGState(context);
CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow);
[[UIColor whiteColor] setFill];
[roundedRectanglePath fill];
CGContextRestoreGState(context);

[[UIColor colorWithRed:200.0/255.0 green:200.0/255.0 blue:200.0/255.0 alpha:0.3] setStroke];
roundedRectanglePath.lineWidth = 0.5;
[roundedRectanglePath stroke];
}

我的问题是,在模拟器中,所有内容都可以完美呈现,但是当我在设备上运行代码(使用iPod touch 4 Generation)时,它仅呈现圆角矩形和边框,而没有阴影。有任何想法吗?

最佳答案

您已经找到了解决方案,但是我将解释为什么原始代码不起作用以及解决方案为什么起作用。

您正在使用ARC,这意味着编译器会自动为您管理Objective-C对象的生存期。但是编译器不了解或管理Core Foundation对象的生存期。您的原始代码说明:

CGColorRef shadow = [UIColor colorWithRed:0.0/255.0 green:0.0/255.0 blue:0.0/255.0 alpha:0.3].CGColor;

调用 +[UIColor colorWithRed:green:blue:]时,它将返回对 UIColor对象的引用。您立即将 CGColor消息发送到 UIColor对象,获得 CGColorRef

由于稍后在该方法中不使用 UIColor对象,因此编译器认为在该语句结尾立即释放 UIColor对象是安全的。在此处释放 UIColor会对其进行分配。释放后, UIColor对象释放 CGColor对象。由于您没有声明 CGColor对象的所有权,因此该发行版取消了 CGColor对象的分配。到 CGContextSetShadowWithColor语句时,包含 CGColor对象的内存处于未知状态。

您的解决方案通过将 +[UIColor colorWithRed:green:blue:]消息嵌入到使用 CGColor对象的语句中来解决此问题。因此,在语句结束并释放并释放 UIColor时,您已经将 CGColor移交给了图形上下文,该上下文保留了它,从而防止了对其的重新分配。

这也是我解决问题的方法。但是还有其他方法。另一种方法是显式声明对 CGColor对象的所有权:
CGColorRef shadow = CGColorRetain([UIColor colorWithRed:0.0/255.0
green:0.0/255.0 blue:0.0/255.0 alpha:0.3].CGColor);

...

CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow);
CGColorRelease(shadow);

关于ios - CGContextSetShadowWithColor没有显示在设备上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14857695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com