2010-01-03 28 views
10

Tôi muốn thay đổi hình nền của UITextField khi nó trở thành firstResponder để hiển thị cho người dùng rằng nó có tiêu điểm, tương tự như: active hoặc: focus pseudo-classes in CSS.Thay đổi nền UITextField khi chỉnh sửa bắt đầu

Tôi đoán rằng tôi có thể cần thực hiện việc này theo lập trình; vì vậy mọi trợ giúp đều được đánh giá cao.

-Giles

Trả lời

26

Bạn cũng có thể sử dụng các phương pháp UITextFieldDelegate (IMHO, dễ bảo quản hơn các quan sát viên key-value):

#pragma mark - 
#pragma mark UITextFieldDelegate methods 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    _field.background = [UIImage imageNamed:@"focus.png"]; 
    return YES; 
} 

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField 
{ 
    _field.background = [UIImage imageNamed:@"nofocus.png"]; 
    return YES; 
} 

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 
    return YES; 
} 

Điều này chỉ hoạt động khi thuộc tính UITextField.borderStyle thuộc bất kỳ kiểu nào nhưng UITextBorderStyleRoundedRect (trong trường hợp đó, thuộc tính nền không được tính đến). Điều này có nghĩa bạn có thể sử dụng đoạn mã trên với UITextBorderStyleBezel, UITextBorderStyleLine và UITextBorderStyleNone, như được giải thích trong tài liệu borderStyle:

borderStyle

Phong cách biên giới được sử dụng bởi các trường văn bản.

@property (nonatomic) UITextBorderStyle borderStyle

Thảo luận

Giá trị mặc định cho thuộc tính này là UITextBorderStyleNone. Nếu một hình nền tùy chỉnh được đặt, thuộc tính này sẽ bị bỏ qua.

Đây là tài liệu hướng dẫn cho các tài sản của nền UITextField:

nền

Hình ảnh biểu thị sự xuất hiện nền của trường text khi nó được kích hoạt.

@property (nonatomic, giữ lại) UIImage * nền

Thảo luận

Khi đặt, hình ảnh được gọi bằng khách sạn này thay thế các tiêu chuẩn xuất hiện điều khiển bởi thuộc tính borderStyle. Hình nền hình ảnh được vẽ ở phần biên giới hình chữ nhật của hình ảnh. Hình ảnh bạn sử dụng cho nền văn bản của trường văn bản có thể kéo dài để vừa.

+0

cảm ơn vì đã đề cập đến borderStyle. Điều này nên được đề cập trong tài liệu cho thuộc tính nền của UITextField – DonnaLea

+0

Tôi đã tìm thấy lỗi trong văn bản của bạn. nếu UITextField là với các góc tròn thì nó bỏ qua tất cả các hình nền. Không phải ngược lại – Gargo

0

Bạn có thể thử quan sát các thay đổi đối với isFirstResponder. và thay đổi nền trong phương thức thông báo. Một cái gì đó như:

[textField addObserver:theObserver forKeyPath:@"isFirstResponder" options:0 context:nil]; 

Sau đó, trong quan sát:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if(object == textField && [keyPath isEqual:@"isFirstResponder"]) { 
     //fiddle with object here 
    } 
} 
+0

Tôi biết cách kiểm tra khi nào nó trở thành đầu tiênResponder nhưng tôi thực sự thay đổi hình nền như thế nào? –

+0

bạn có thể thay đổi nội dung lớp của textField thành CGImage textField.layer.contents = myImage.CGImage; sẽ hoạt động. – Elfred

26

Cách IMHO sạch nhất là để phân lớp UITextField và ghi đè becomeFirstResponderresignFirstResponder để thay đổi hình nền của trường text. Bằng cách đó, bạn có thể sử dụng phân lớp mới của bạn bất cứ nơi nào mà không cần phải reimplement các phương thức đại biểu để thay đổi nền.

- (BOOL)becomeFirstResponder { 
    BOOL outcome = [super becomeFirstResponder]; 
    if (outcome) { 
     self.background = // selected state image; 
    } 
    return outcome; 
} 

- (BOOL)resignFirstResponder { 
    BOOL outcome = [super resignFirstResponder]; 
    if (outcome) { 
     self.background = // normal state image; 
    } 
    return outcome; 
} 
+0

Rất thông minh, cảm ơn bạn – Dvole

+0

Sạch sẽ là chủ quan, những người ủng hộ thành phần có hương vị khác nhau của giải pháp sạch nhất. –

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