2017-08-12 138 views
1

我正在做一些NSSearchFieldCell子類的自定義繪圖。但是,覆蓋任何兩種繪圖方法都會導致佔位符文本不對齊。覆蓋NSSearchFieldCell導致佔位符不居中

例如,僅使用此替代NSCell的繪圖方法的自定義NSSearchFieldCell子類會導致佔位符文本左對齊。

class CustomSearchFieldCell: NSSearchFieldCell { 
    override func draw(withFrame cellFrame: NSRect, in controlView: NSView) { 
     super.draw(withFrame: cellFrame, in: controlView) 
    } 

    override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) { 
     super.drawInterior(withFrame: cellFrame, in: controlView) 
    } 
} 

這甚至是搜索領域的centersPlaceholder屬性設置爲true兩者重新佈局搜索領域或重置搜索領域的stringValue之後。

談到了這兩種方法將使佔位符文本(和放大鏡再次集中。

search field center aligned

然而,僅僅一個覆寫(即使什麼都不做,只調用了其超實施)將使搜索領域的佔位符文本和放大鏡成爲左對齊。

search field left aligned

的問題是,如何讓center align placeholder工作,仍然有自定義繪圖?

請注意,我需要在單元格內執行一些自定義繪圖和鼠標處理,因此需要覆蓋。

這是在macOS 10.12.6上觀察到的。

+0

當我看着我的代碼我有相同的要求,但我沒有使用任何方法來實現這個東西在我的應用程序也沒有使用繪製方法。 –

回答

0

你應該看看這種方法,因爲它被調用時,鼠標離開文本字段,並相應地更新框架: -

- (void)stopTracking:(NSPoint)lastPoint at:(NSPoint)stopPoint inView:(NSView *)controlView mouseIsUp:(BOOL)flag; 

我有一個要求,垂直居中NSSearchFieldCell的文字和下面的代碼做的伎倆,所以你可以給它一個嘗試中心,你需要的組件 - :

// 
// VerticallyCenteredTextFieldCell.m 
// 
// Created by Vikram on 01/03/17. 
// Copyright © 2017 Vikram. All rights reserved. 
// 

#import "VerticallyCenteredTextFieldCell.h" 

@implementation VerticallyCenteredTextFieldCell 

- (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-3); 
} 
- (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]; 
} 

@end 

我在做它的Objective-C,從而相應地讀它,讓它在迅速有用。

+0

這是來自[RSVerticallyCenteredTextFieldCell](https://red-sweater.com/blog/148/what-a-difference-a-cell-makes)嗎? – adib

+0

不,它是由我定製的。爲什麼? –