gpt4 book ai didi

iOS:在自定义属性动画期间以正确的分辨率将 CGImage 绘制到 CALayer 的子类中

转载 作者:行者123 更新时间:2023-11-28 17:41:41 25 4
gpt4 key购买 nike

我的智慧已经走到尽头了......

我有一个 View 应该显示一个动画圆形部分,它是预渲染的并且可以作为 png 文件使用(视网膜和非视网膜版本,正确命名;pie_p_000.png 与 pie_p_000@2x.png)。此部分应根据应用内某个百分比值的变化进行动画处理。所以我做了一个 UIView 的子类,它在它的图层层次结构中有一个自定义的 CALayer。计划是为 CALayer 子类实现自定义动画属性,并在覆盖的方法 drawInContext: 中更改图片。到目前为止一切顺利,当我使用 View 的函数 setPercentageWithFloat: 更改百分比值时,计划有效并显示动画(下面的完整源代码)。问题是:我真的不知道为什么我的 iPhone4 总是显示低分辨率图像。我已经尝试过使用比例因子,但这没有帮助。图像以正确的尺寸和低分辨率呈现,或者图像以双倍尺寸呈现。覆盖显示:直接设置contents属性的效果是不出现动画(动画期间不呈现图像);在动画时间之后呈现最终图像。在这种情况下,会显示正确分辨率的图像。

顺便说一句:下面的代码在错误处理、灵 active 和优雅方面不是很复杂,因为它只是试图让那个东西运行 ;) - 所以图像仍然呈现翻转等......

我希望有人能给我一些提示。谢谢

View :

#import "ScrollBarView.h"
#import "ScrollBarLayer.h"

@implementation ScrollBarView

@synthesize sbl;

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}

- (void)setImagesWithName:(NSString*)imageName {
ScrollBarLayer *ssbl = [[ScrollBarLayer alloc] init];
ssbl.frame = CGRectMake(0, 0, 30, 30);
[ssbl setImagesWithName:imageName];
[self.layer addSublayer:ssbl];

self.sbl = ssbl;

[ssbl release];
}

- (void) dealloc {
self.sbl = nil;
[super dealloc];
}

- (void)setPercentageWithFloat:(CGFloat)perc {
if(perc > 1.0){
perc = 1.0;
} else if(perc < 0) {
perc = 0;
}

[self.sbl setPercentage:perc];

CABasicAnimation* ba = [CABasicAnimation animationWithKeyPath:@"percentage"];
ba.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
ba.duration = 0.8;
ba.toValue = [NSNumber numberWithFloat:perc];
[self.sbl addAnimation:ba forKey:nil];
}
@end

可以将 View 配置为使用不同的名称 (theName) 使用不同的图像(使用函数 setImagesWithName:)。在此方法中, View 将 ScrollBarLayer 添加到其层属性。

图层:

#import "ScrollBarLayer.h"

@implementation ScrollBarLayer

@synthesize filename;
@dynamic percentage;

- (id)init {
self = [super init];
if (self) {

}
return self;
}

- (void)setImagesWithName:(NSString*)imageName {
self.frame = CGRectMake(0, 0, 30, 30);
self.percentage = 0;
self.filename = imageName;
}

+ (BOOL) needsDisplayForKey:(NSString*)key {
if([key isEqualToString:@"percentage"]) {
return YES;
}
return [super needsDisplayForKey:key];
}

- (void) drawInContext:(CGContextRef)ctx {

int imageIdx = (int)roundf((float)199 * self.percentage);
NSString *thisfilename = [self.filename stringByAppendingString:[NSString stringWithFormat:@"%03d.png", i+1]];
UIImage* c = [UIImage imageNamed:thisfilename];
CGImageRef img = [c CGImage];
CGSize sz = CGSizeMake(CGImageGetWidth(img), CGImageGetHeight(img));

UIGraphicsBeginImageContextWithOptions(CGSizeMake(sz.width, sz.height), NO, 0.0);
CGContextDrawImage(ctx, CGRectMake(0, 0, sz.width, sz.height), img);
UIGraphicsEndImageContext();
}

- (void) dealloc {
self.pictures = nil;
self.filename = nil;
[super dealloc];
}

@end

最佳答案

我也需要了解一下。

我认为问题出在点和像素之间......我认为你应该检查设备是否有视网膜显示器,如果有,你应该更换 CGContextDrawImage(...) CGRect(在第二个参数中)对于半宽半高的。

#define IS_RETINA_DISPLAY() ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00)

...
UIGraphicsBeginImageContextWithOptions(CGSizeMake(sz.width, sz.height), NO, 0.0);

if (IS_RETINA_DISPLAY())
{
CGContextDrawImage(ctx, CGRectMake(0, 0, sz.width/2.0f, sz.height/2.0f), img);
} else
{
CGContextDrawImage(ctx, CGRectMake(0, 0, sz.width, sz.height), img);
}
UIGraphicsEndImageContext();
...

但我不确定这个鳃会给你一个“平滑”的结果......

关于iOS:在自定义属性动画期间以正确的分辨率将 CGImage 绘制到 CALayer 的子类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7910722/

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