2010-05-29 15 views
9

Vì một lý do nào đó, khi tôi thêm UITextfield làm phần phụ của khung nhìn nội dung của tablecell, nút xóa không phù hợp với văn bản được nhập trong trường và xuất hiện một chút bên dưới văn bản đó. Có cách nào tôi có thể di chuyển các văn bản của clearbutton để ngăn chặn điều này xảy ra? Cảm ơn bạn đã được trợ giúp,Làm cách nào để di chuyển nút rõ ràng trong UITextField?

Trả lời

3

Tôi chưa thấy điều này và ảnh chụp màn hình sẽ hữu ích. Tuy nhiên, câu trả lời nhanh là bạn có thể kiểm tra mảng subviews của UITextField, tìm subview có chứa nút rõ ràng, và điều chỉnh frame.origin của nó.

Chỉnh sửa: Có vẻ như tôi đã bị bỏ phiếu cho câu trả lời này (được viết vào năm 2010). Đây không phải là phương thức được chấp thuận "chính thức" bởi vì bạn đang thao túng các đối tượng riêng tư, nhưng Apple không thể phát hiện ra nó. Rủi ro chính là phân cấp khung nhìn có thể được thay đổi tại một số điểm.

+0

Cảm ơn bạn đã tip, tôi đang trên đường ngay bây giờ nhưng khi tôi dừng lại, tôi sẽ dùng thử và cập nhật cho bạn. – Jake

+0

Yeah im chỉ di chuyển subview. – Jake

+0

Mã của UITextField.m không thể truy cập được. UITextField nên được subclassed – Luda

1

Subclass UITextField và ghi đè phương pháp này:

- (CGRect)clearButtonRectForBounds:(CGRect)bounds 
{ 
    return CGRectMake(bounds.origin.x - 10, bounds.origin.y, bounds.size.width, bounds.size.height); 
} 

bù lại CGRect phù hợp với nhu cầu của bạn.

+2

Điều này sẽ không đặt nút ở cạnh phải. Điều này sẽ: trả về CGRectMake (bounds.size.width/2-20, bounds.origin.y-3, bounds.size.width, bounds.size.height); – Luda

6

Tôi đã phân loại số UITextField và ghi đè hàm .

.h

#import <UIKit/UIKit.h> 

@interface TVUITextFieldWithClearButton : UITextField 

@end 

.m

#import "TVUITextFieldWithClearButton.h" 

@implementation TVUITextFieldWithClearButton 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

- (void)awakeFromNib 
{ 
    self.clearButtonMode = UITextFieldViewModeWhileEditing; 
} 


- (CGRect)clearButtonRectForBounds:(CGRect)bounds 
{ 
    return CGRectMake(bounds.size.width/2-20 , bounds.origin.y-3, bounds.size.width, bounds.size.height); 
} 

@end 
+1

Có vẻ như bạn đã downvoted các câu trả lời khác. Không mát mẻ. –

+7

Tôi đã bỏ phiếu bầu chọn một trong những câu trả lời. Tôi đã làm điều đó bởi vì câu trả lời, theo ý kiến ​​của tôi, là sai. Tôi đã nhận xét lý do tại sao tôi nghĩ như vậy, và tôi sẽ vui mừng khi tiếp tục nói chuyện với bạn về điều đó (trên các chủ đề liên quan). Hầu hết các nhà nhập khẩu là để hiểu làm thế nào những điều được thực hiện đúng và không phải là mát như thế nào là bạn. – Luda

26

Như đã trình bày bởi @Luda cách chính xác là để phân lớp UITextField và ghi đè - (CGRect)clearButtonRectForBounds:(CGRect)bounds. Tuy nhiên, các giới hạn được truyền vào phương thức là các phương thức của chính chế độ xem chứ không phải là nút. Vì vậy, bạn nên gọi super để có được kích thước hệ điều hành được cung cấp (để tránh biến dạng của hình ảnh) và sau đó điều chỉnh nguồn gốc cho phù hợp với nhu cầu của bạn.

ví dụ:

- (CGRect)clearButtonRectForBounds:(CGRect)bounds { 
    CGRect originalRect = [super clearButtonRectForBounds:bounds]; 
    return CGRectOffset(originalRect, -10, 0); //shift the button 10 points to the left 
} 

của Apple docs nhà nước:

Thảo luận Bạn không nên gọi phương pháp này trực tiếp. Nếu bạn muốn đặt nút rõ ràng ở một vị trí khác, bạn có thể ghi đè phương thức này và trả lại hình chữ nhật mới. Phương pháp của bạn nên gọi triển khai siêu thực hiện và chỉ sửa đổi xuất xứ của hình chữ nhật được trả lại. Thay đổi kích thước của nút rõ ràng có thể gây biến dạng không cần thiết của hình ảnh nút.

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