2009-09-21 48 views
5

Tôi có một tùy chỉnh UIView được vẽ bằng phương pháp -[drawRect:] của nó.Chống răng cưa lạ trong chế độ xem tùy chỉnh

Vấn đề là hành vi chống răng cưa rất lạ khi đường kẻ màu đen hoặc đường ngang được vẽ rất mờ.

Nếu tôi tắt tính năng chống răng cưa với CGContextSetAllowsAntialiasing, mọi thứ được vẽ như mong đợi.

Anti-Aliasing:
alt text http://dustlab.com/stuff/antialias.png

Không Anti-Aliasing (trông giống như kết quả mong đợi với AA):
alt text http://dustlab.com/stuff/no_antialias.png

Chiều rộng dòng chính là 1, và tất cả các tọa độ là những giá trị không thể thiếu .

Điều tương tự cũng xảy ra nếu tôi vẽ hình chữ nhật bằng cách sử dụng CGContextStrokeRect, nhưng không phải nếu tôi vẽ chính xác cùng một CGRect với UIRectStroke.

Trả lời

10

Kể từ khi một cơn đột quỵ mở rộng một lượng tương đương với cả hai bên, một dòng chiều rộng một pixel không được đặt trên tọa độ nguyên, nhưng ở độ lệch 0,5 pixel.

Tính đúng tọa độ cho đường vuốt ve như thế này:

CGPoint pos = CGPointMake(floorf(pos.x) + 0.5f, floorf(pos.y) + 0.5f); 

BTW: Xin chớ từ bỏ giá trị của bạn để int và lưng nổi để thoát khỏi phần thập phân. Có một chức năng cho điều này trong C gọi là floor.

+2

Thêm vào đó, Apple cung cấp một số mẹo và mã mẫu đẹp trong phần "Vẽ Pixel-Chính xác" của Hướng dẫn vẽ Cocoa: http://developer.apple.com/mac/library/documentation/Cocoa/ Conceptual/CocoaDrawingGuide/Transforms/Transforms.html # // apple_ref/doc/uid/TP40003290-CH204-BCICIJAJ –

+0

đây là cách đơn giản để tránh mà không có bất kỳ mã nào tại http://www.techpaa.com/2012/06/avoiding -view-edge-antialiasing.html – ShivaPrasad

+0

@jeeva 'UIViewEdgeAntialiasing' chỉ dành cho các cạnh của các lớp. Câu hỏi đặt ra là các dòng được vẽ trong Quartz. Bản vẽ thạch anh không bị ảnh hưởng bởi 'UIViewEdgeAntialiasing'. –

0

trong khung xem của bạn, bạn có thể có các giá trị float không phải là số nguyên. Trong khi các khung là đủ chính xác để làm các phần phân đoạn của một điểm ảnh (float), bạn sẽ nhận được vết mờ trừ khi bạn cast một int

CGRect frame = CGRectMake((int)self.frame.bounds..., (int)...., (int)...., (int)....); 
Các vấn đề liên quan