2009-08-10 37 views
10

Tôi đang gặp sự cố với văn bản của UITextField bị mờ/chống răng cưa ngay cả với kích thước phông chữ chuẩn. Các văn bản sẽ xuất hiện rõ nét khi điều khiển là trả lời đầu tiên, nhưng mờ một lần nữa khi nó mất tập trung:Văn bản mờ UITextField

alt text http://www.mikeweller.com/images/blog/UITextFieldBlur.png

Có ai biết làm thế nào để sửa lỗi này?

+0

Tôi đã mở tài khoản này dưới dạng wiki, vui lòng sửa đổi câu hỏi/câu trả lời. –

Trả lời

12

OK Tôi đang trả lời câu hỏi của riêng mình tại đây.

Tôi đã tìm thấy một số tham chiếu đến lỗi này thông qua Google, nhưng mọi người đã làm việc xung quanh nó bằng cách chơi với kích thước phông chữ. Sau nhiều lần săn, tôi thấy this thread cho biết tính năng chống răng cưa được áp dụng khi khung của khung nhìn chứa các giá trị pixel phân số, ví dụ: nếu bạn tính kích thước của nó như là một phần của chế độ xem siêu.

Chắc chắn đủ, truyền các giá trị CGRect tới (int) cho khung của khung nhìn hoạt động hoàn hảo. Vì vậy, làm ví dụ, nếu bạn muốn trường văn bản của bạn được làm trung tâm theo chiều dọc trong SuperView, bạn nên sử dụng một (int) đúc như thế này:

 
textFieldWidth = 300; 
textFieldHeight = 31; 
offsetX = 0; 
offsetY = (superview.bounds.size.height - textFieldHeight)/2; 

textField.frame = CGRectMake((int) offsetX, 
          (int) offsetY, 
          (int) textFieldWidth, 
          (int) textFieldHeight); 

Ngoài ra còn có các chức năng CGRectIntegral mà bạn có thể sử dụng để chuyển đổi một CGRect đến các giá trị tích phân.

+7

Tôi đề nghị bạn * không * cast thành int để làm tròn một giá trị dấu chấm động. Có một chức năng cho điều đó. Nó là 'tròn'. Việc truyền tới int sẽ được đưa trở lại float khi 'CGRectMake' lấy các tham số float. Diễn viên kép này làm cho ý định của nó trở nên tồi tệ và có thể có thể tồi tệ hơn. Sau đó, một lần nữa, CGRectIntegral thậm chí còn tốt hơn. –

+0

cũng, thay vì tròn, bạn có thể sử dụng cielf hoặc floorf (??) để làm tròn lên hoặc xuống giá trị tích phân gần nhất tương ứng. –

26

Sử dụng CGRectIntegral để đảm bảo khung của trường văn bản dựa trên tọa độ nguyên. Bạn sẽ nhận được antialiasing mờ khi mọi thứ nằm trên tọa độ phân đoạn.

+0

sollution sạch nhất.Vì mục đích của tôi, tôi đã thêm phần mở rộng NSView với '- (void) convertFrameMeasurementsToInteger { \t self.frame = CGRectIntegral (self.frame); } ' .. nhưng thậm chí tốt hơn nên có một cờ như' useIntegerBounds' và ghi đè lên '-setFrame' – codrut

0

Tôi rất muốn đóng góp vì tôi vừa phát hiện ra câu trả lời của riêng mình sau một chút thất vọng.

UITextField trong InterfaceBuilder có chiều cao khung hình bắt buộc là 31 pixel. Điều này không thể được nhấp chuột kéo để thay đổi kích thước cũng không thể được đặt trong thuộc tính khung trong IB. Bạn cần phải đi đến viewDidLoad và điều chỉnh chiều cao khung thành 32 pixel, và điều này sẽ giải quyết được vấn đề.

Hy vọng các phiên bản tương lai của IB sẽ sửa lỗi này.

1

Ngoài việc sử dụng định vị không phân đoạn, hãy đảm bảo sử dụng căn chỉnh không căn giữa cho UITextField. Dường như căn chỉnh theo chiều dọc được căn giữa kết hợp với kích thước phông chữ lẻ cũng dẫn đến văn bản mờ.

0

tôi đã thử sử dụng CGRectIntegral và nội dung. Trong trường hợp của tôi thay đổi kích thước phông chữ và kích thước phông chữ trong IB đã làm nó.

0

Tôi đã gặp sự cố này trước đây. Giải pháp bên dưới hoạt động hoàn hảo cho bất kỳ kích thước khung hình hoặc văn bản nào vì nó sử dụng hàm tròn để loại bỏ các giá trị pixel phân số. Chèn mã sau đây sau khi bạn khởi tạo uitextfield đang được đề cập đến.

CGRect temp = textField.frame; 
temp.origin.x = round(temp.origin.x); 
temp.origin.y = round(temp.origin.y); 
textField.frame = temp; 
0

Chỉ cần đặt chiều cao khung UITextField thành giá trị đồng đều đã sửa nó cho tôi.

+0

Điều này không thực sự khắc phục được sự cố, nó chỉ hoạt động xung quanh vấn đề cơ bản để bạn có thể nhận được kích thước không gây ra hiện tượng mờ. Việc buộc khung thành các giá trị tích phân sẽ khắc phục sự cố một cách chính xác. –

+0

Tốt cho tôi nó đã làm. Tôi đang sử dụng systemFontOfSize: 18 – samvermette

Các vấn đề liên quan