2012-01-10 5 views
5

Tôi đang cố gắng tạo thanh tải hình tròn và muốn sử dụng Đồ họa lõi thay vì che hình ảnh để tạo hiệu ứng. Tuy nhiên, tôi không nhận được sự trung thực mà tôi đã hy vọng: enter image description hereLàm mịn đường cong đồ họa cốt lõi

Không có vấn đề gì tôi đã thử, các jaggies có vẻ khá xấu. Antialiasing đang bật và tôi đã thử chuyển "flatness" xuống .1 trên CGContextRef. Hình ảnh là từ trình mô phỏng (Retina), có vẻ như hơi tốt hơn trên thiết bị nhưng vẫn không tuyệt vời như vậy.

Vẽ mã, trong một lớp con của CALayer:

-(void)drawInContext:(CGContextRef)ctx {  
    CGPoint center = CGPointMake(self.frame.size.width/2, self.frame.size.height/2); 

    CGFloat delta = toRadians(360 * percent); 

    CGFloat innerRadius = 69.5; 
    CGFloat outerRadius = innerRadius + 12; 

    CGContextSetFillColorWithColor(ctx, [UIColor colorWithRed:99/256.0 green:183/256.0 blue:70/256.0 alpha:.5].CGColor); 
    CGContextSetStrokeColorWithColor(ctx, [UIColor colorWithRed:99/256.0 green:183/256.0 blue:70/256.0 alpha:10.0].CGColor); 
    CGContextSetLineWidth(ctx, 1); 

    CGMutablePathRef path = CGPathCreateMutable(); 

    CGPathAddRelativeArc(path, NULL, center.x, center.y, innerRadius, -(M_PI/2), delta); 
    CGPathAddRelativeArc(path, NULL, center.x, center.y, outerRadius, delta - (M_PI/2), -delta); 
    CGPathAddLineToPoint(path, NULL, center.x, center.y-innerRadius); 

    CGContextAddPath(ctx, path); 
    CGContextFillPath(ctx); 
    CGContextAddPath(ctx, path); 
    CGContextStrokePath(ctx); 
} 

này đồ họa Core tốt nhất có thể làm hay tôi thiếu một cái gì đó là?

+1

Xem xét hình ảnh của bạn rõ ràng đã được thu nhỏ bằng 2 trong mỗi thứ nguyên và bạn lấy hình ảnh từ trình mô phỏng Retina, tôi sẽ nói có vấn đề với biến đổi lớp của bạn hoặc một trong các bậc cha mẹ của nó. Bạn đang tạo 'ctx' trong một số phương pháp khác hay là khung công tác chuyển nó cho bạn? Đầu ra của 'NSLog ("% @ "là gì, [[[UIApplication sharedApplication] keyWindow] recursiveDescription])'? –

+0

Ngữ cảnh được cung cấp cho tôi bởi CALayer. [Ở đây] (http://pastebin.com/0Gjkxh2a) là đầu ra của 'recursiveDescription'. 'KDGoalBar' là lớp con UIControl đang được đặt trong và' KDGoalBarPercentLayer' là nơi bản vẽ thực tế đang được thực hiện. – Kevin

Trả lời

10

Tìm ra vấn đề cụ thể của tôi. Vì tôi đã tạo một CALayer (để thêm làm lớp con), contentScale không tự động được đặt thành màn hình Retina. Điều này giải quyết nó:

percentLayer.contentsScale = [UIScreen mainScreen].scale; 

Cảm ơn Rob, vì đã đẩy tôi đi đúng hướng.

+0

Tôi ước tôi có thể +10 điều này. – coneybeare

+0

mở rộng quy mô, là điểm yếu cho những người mới như tôi, người đã xem trước mã vẽ trong màn hình không có võng mạc và thấy cạnh lởm chởm khi triển khai trên màn hình võng mạc. Từ "quy mô" của bạn ngay lập tức nhắc nhở tôi tôi đang vẽ trong bối cảnh không võng mạc và hy vọng nó sẽ được chính xác như nhau trong bối cảnh võng mạc. 1 cho bạn. –