2013-02-22 30 views
13

Tôi đang cố gắng đặt phần giữ chỗ trong trường văn bản nghiêng và vì ứng dụng của tôi đang nhắm mục tiêu iOS 6.0 trở lên, đã quyết định sử dụng thuộc tính attributedPlaceholder thay vì lăn tùy chỉnh hơn. Mã như sau:UITextField được gán choPlaceholder không có hiệu lực

NSString *plString = @"optional"; 
NSAttributedString *placeholder = [[NSAttributedString alloc] initWithString:plString 
     attributes:@{NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-LightItalic" size:15]}]; 
for (UITextField *t in myTextfields){ 
    t.placeholder = plString; 
    t.attributedPlaceholder = placeholder; 
} 

Tuy nhiên, kiểu dáng của trình giữ chỗ vẫn không phải là nghiêng, nhưng giống như văn bản thông thường, chỉ cần làm mờ. Tôi đang thiếu gì để thực hiện tác phẩm NSAttributedString?

+1

tôi có thể tái tạo vấn đề của bạn và tôi nghĩ đây là một lỗi trong iOS. – Florian

Trả lời

16

Như được lưu ý bởi warren, kiểu dáng hiện không thể hoàn thành theo cách bạn đang cố gắng. Cách giải quyết tốt là thiết lập thuộc tính phông chữ của trường văn bản theo cách bạn muốn trình giữ chỗ của mình nhìn và sau đó thay đổi phông chữ của trường văn bản bất cứ khi nào người dùng bắt đầu nhập. Nó trông giống như trình giữ chỗ và văn bản là các phông chữ khác nhau.

Bạn có thể làm điều này bằng cách tạo ra một đại biểu của textfield và sử dụng shouldChangeCharactersinRange như thế này:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{  
    // If there is text in the text field 
    if (textField.text.length + (string.length - range.length) > 0) { 
     // Set textfield font 
     textField.font = [UIFont fontWithName:@"Font" size:14]; 
    } else { 
     // Set textfield placeholder font (or so it appears) 
     textField.font = [UIFont fontWithName:@"PlaceholderFont" size:14]; 
    } 

    return YES; 
} 
10

Điều này gần như chắc chắn là một lỗi. Các documentation for the attributedPlaceholder property tuyên bố rằng chuỗi sẽ được rút ra bằng cách sử dụng một màu xám bất kể thuộc tính màu nền trước, nhưng đây không phải là trường hợp: bạn có thể đặt cả màu nền trước và màu nền. Thật không may, thuộc tính phông chữ dường như bị tước bỏ và được hoàn nguyên về phông chữ hệ thống.

Để giải quyết sự cố này, tôi khuyên bạn nên ghi đè drawPlaceholderInRect: và tự vẽ chính trình giữ chỗ đó. Ngoài ra, bạn nên gửi một Radar về điều này và bao gồm một dự án mẫu tối thiểu thể hiện lỗi.

+0

Dường như drawPlaceholderInRect: sẽ không được gọi trong UITextField. Xem http://stackoverflow.com/questions/1920783/drawtextinrect-on-uitextfield-not-called –

+0

Xin vui lòng, bỏ qua bình luận của tôi, câu hỏi SO đó là cũ và bây giờ nó có vẻ hoạt động. –

8

Tôi chỉ cần stumbled khi vấn đề này bản thân mình. Rõ ràng, trình giữ chỗ sẽ lấy bất kỳ phông chữ nào mà textfield đang được gán. Chỉ cần đặt phông chữ của textfield và bạn là tốt.

Đối với mọi thứ khác, như màu sắc của placeholder, tôi vẫn quay trở lại attributedPlaceholder

+0

Câu trả lời thú vị. Đã làm cho tôi! – nimeshdesai

-1

iOS8/9/Swift 2.0 - ví dụ làm việc

func colorPlaceholderText(){ 
    var multipleAttributes = [String : NSObject]() 
    multipleAttributes[NSForegroundColorAttributeName] = UIColor.appColorCYAN() 
    //OK - comment in if you want background color 
    //multipleAttributes[NSBackgroundColorAttributeName] = UIColor.yellowColor() 
    //OK - Adds underline 
    //multipleAttributes[NSUnderlineStyleAttributeName] = NSUnderlineStyle.StyleDouble.rawValue 


    let titleString = "Search port/country/vessel..." 
    let titleAttributedString = NSAttributedString(string: titleString, 
     attributes: multipleAttributes) 


    self.textFieldAddSearch.attributedPlaceholder = titleAttributedString 
} 
+0

Điều này phù hợp với màu sắc. Nhưng không phải cho chính font chữ – dmclean

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