2012-02-22 36 views
10

Tôi đang cố gắng căn giữa văn bản trong NSTextFields của mình, nhưng một trong số chúng là một mật khẩu, vì vậy đó là một NSSecureTextField. Tôi đã thiết lập lớp của nó là MDVerticallyCenteredSecureTextFieldCell với việc thực hiện sau đây:Văn bản trung tâm theo chiều dọc trong NSSecureTextField với phân lớp

- (NSRect)adjustedFrameToVerticallyCenterText:(NSRect)frame { 
    // super would normally draw text at the top of the cell 
    NSInteger offset = floor((NSHeight(frame) - 
           ([[self font] ascender] - [[self font] descender]))/2); 
    return NSInsetRect(frame, 0.0, offset+10); 
} 

- (void)editWithFrame:(NSRect)aRect inView:(NSView *)controlView 
       editor:(NSText *)editor delegate:(id)delegate event:(NSEvent *)event { 
    [super editWithFrame:[self adjustedFrameToVerticallyCenterText:aRect] 
        inView:controlView editor:editor delegate:delegate event:event]; 
} 

- (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView 
       editor:(NSText *)editor delegate:(id)delegate 
        start:(NSInteger)start length:(NSInteger)length { 

    [super selectWithFrame:[self adjustedFrameToVerticallyCenterText:aRect] 
        inView:controlView editor:editor delegate:delegate 
        start:start length:length]; 
} 

- (void)drawInteriorWithFrame:(NSRect)frame inView:(NSView *)view { 
    [super drawInteriorWithFrame: 
    [self adjustedFrameToVerticallyCenterText:frame] inView:view]; 
} 

-(void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView 
{ 
    [super drawWithFrame:cellFrame inView:controlView]; 
} 

Một lớp con tương tự đã được làm việc cho thường xuyên NSTextFieldCell s, chỉ cần không an toàn phiên bản này. Có vẻ như Apple đã bằng cách nào đó bảo vệ các phương pháp này khỏi bị ghi đè.

Bây giờ trường mật khẩu là người duy nhất lệch:

misaligned "password" field

bất cứ ai có thể đề xuất một cách có phương pháp các NSSecureTextFieldCell lớp con để được gọi hoặc một cách khác để theo chiều dọc tập trung các lĩnh vực văn bản?

Trả lời

22

Hãy thử sử dụng NSTextField thông thường, với lớp con NSSecureTextFieldCell bên trong. Tôi đã có cùng một vấn đề và sự kết hợp này làm việc.

+2

Cảm ơn, điều này đã hiệu quả. – jrc

+0

Điều này cũng phù hợp với tôi. Cảm ơn! – Tommy

2

Tất cả những gì bạn phải làm để căn giữa văn bản giữ chỗ trong một số NSTextField hoặc NSSecureTextField là chọn hộp kiểm "Sử dụng chế độ một đường" trong thanh tra Thuộc tính (phần Trường văn bản). Nếu bạn không sử dụng IB, bạn có thể đặt nó lập trình như vậy:

[mySecureTextField.cell setUsesSingleLineMode:YES]; 
4

Bạn có thể tạo lớp con của các NSSecureTextField như:

@implementation SubclassTextField 

+ (Class)cellClass { 
    return [SubclassTextFieldCell class]; 
} 

@end 

và lớp con của tế bào:

@implementation SubclassTextFieldCell 

- (NSRect)drawingRectForBounds:(NSRect)rect { 
    // It will be working 
    ... 
} 

... 
@end 

Nếu bạn làm như vậy thì các phương thức từ phân lớp NSSecureTextField sẽ bắt đầu hoạt động.

+1

Đây là câu trả lời đúng. Việc gán một lớp ô tùy chỉnh trong Trình tạo giao diện không đủ. '- [NSSecureTextField initWithCoder:]' kiểm tra lớp của ô đã giải mã và sẽ tạo một cá thể mới nếu nó không khớp với '+ cellClass'. –

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