9

中央の垂直方向の配置で表示したい NSTextFieldCell があります。ここの古い質問とブログ エントリのおかげで、2 つの有効な解決策があります。

ただし、どちらのソリューションも、セルを右揃えに設定する能力を押しつぶしているようです。これらのソリューションのいずれかが両方の形式の調整をサポートするように手伝ってくれる人はいますか?

1 つのソリューションのコードを次に示します。

@implementation MiddleAlignedTextFieldCell

- (NSRect)titleRectForBounds:(NSRect)theRect {
    NSRect titleFrame = [super titleRectForBounds:theRect];
    NSSize titleSize = [[self attributedStringValue] size];
    titleFrame.origin.y = theRect.origin.y - .5 + (theRect.size.height - titleSize.height) / 2.0;
    return titleFrame;
}

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
    NSRect titleRect = [self titleRectForBounds:cellFrame];
    [[self attributedStringValue] drawInRect:titleRect];
}

@end

別の解決策は次のとおりです (このブログから取得):

@implementation RSVerticallyCenteredTextFieldCell

- (NSRect)drawingRectForBounds:(NSRect)theRect
{
    NSRect newRect = [super drawingRectForBounds:theRect];

    if (mIsEditingOrSelecting == NO)
    {
        // Get our ideal size for current text
        NSSize textSize = [self cellSizeForBounds:theRect];

        // Center that in the proposed rect
        float heightDelta = newRect.size.height - textSize.height;  
        if (heightDelta > 0)
        {
            newRect.size.height -= heightDelta;
            newRect.origin.y += (heightDelta / 2);
        }
    }

    return newRect;
}

- (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(int)selStart length:(int)selLength
{
    aRect = [self drawingRectForBounds:aRect];
    mIsEditingOrSelecting = YES;    
    [super selectWithFrame:aRect inView:controlView editor:textObj delegate:anObject start:selStart length:selLength];
    mIsEditingOrSelecting = NO;
}

- (void)editWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject event:(NSEvent *)theEvent
{   
    aRect = [self drawingRectForBounds:aRect];
    mIsEditingOrSelecting = YES;
    [super editWithFrame:aRect inView:controlView editor:textObj delegate:anObject event:theEvent];
    mIsEditingOrSelecting = NO;
}

@end
4

3 に答える 3

5

うまくいくので、この回答を質問に投稿していますが、IBからアライメント設定を確認する別の方法が見つからなかったという事実は非常に迷惑です。_cFlags へのアクセスは少し汚いように思えます。よりクリーンな方法を見つけたいと思っています。

このブログエントリから以前に投稿されたコードに基づいています。

- (NSRect)drawingRectForBounds:(NSRect)theRect
{
    // Get the parent's idea of where we should draw
    NSRect newRect = [super drawingRectForBounds:theRect];

    if (mIsEditingOrSelecting == NO)
    {
        // Get our ideal size for current text
        NSSize textSize = [self cellSizeForBounds:theRect];

        // Center that in the proposed rect
        float heightDelta = newRect.size.height - textSize.height;  
        if (heightDelta > 0)
        {
            newRect.size.height -= heightDelta;
            newRect.origin.y += (heightDelta / 2);
        }

        // For some reason right aligned text doesn't work.  This section makes it work if set in IB.
        // HACK: using _cFlags isn't a great idea, but I couldn't find another way to find the alignment.
        // TODO: replace _cFlags usage if a better solution is found.
        float widthDelta = newRect.size.width - textSize.width;
        if (_cFlags.alignment == NSRightTextAlignment && widthDelta > 0) {
            newRect.size.width -= widthDelta;
            newRect.origin.x += widthDelta;
        }

    }

    return newRect;
}
于 2009-11-19T16:48:23.510 に答える
3

NSParagraphStyle/NSMutableParagraphStyle を使用して配置 (およびその他の属性) を設定できます。適切に構成された NSParagraphStyle オブジェクトを属性付き文字列の全範囲に追加します。

于 2009-11-19T00:30:26.837 に答える
2

私がしばらく前に尋ねた同様の質問に投稿されたいくつかの潜在的な解決策があります。

正直なところ、私はまだ文書化されていない_cFlags.vCenteredブール値 ( tsk tsk、悪いプログラマー!) を使用して仕事を成し遂げています。それは簡単で、うまくいきます。必要に応じて、後で車輪を再発明します。

アップデート:

わかりました、私はそれを理解したと思います。superどちらのソリューションも、デフォルトの rect を取得するための呼び出しに依存しており、垂直方向のセンタリングを変更origin.yして実行します。size.heightただし、 への呼び出しはsuper、テキストが水平方向に収まるように幅が既に調整されている四角形を返します。

解決策は、メソッドに渡される境界矩形からorigin.x使用することです。size.width

ソリューション#1:

- (NSRect)titleRectForBounds:(NSRect)theRect {
    NSRect titleFrame = [super titleRectForBounds:theRect];
    NSSize titleSize = [[self attributedStringValue] size];

    // modified:
    theRect.origin.y += (theRect.size.height - titleSize.height)/2.0 - 0.5;
    return theRect;
}

解決策 2:

- (NSRect)drawingRectForBounds:(NSRect)theRect
{
    NSRect newRect = [super drawingRectForBounds:theRect];

    // modified:
    newRect.origin.x = theRect.origin.x;
    newRect.size.width = theRect.size.width;

    if (mIsEditingOrSelecting == NO)
    {
        // Get our ideal size for current text
        NSSize textSize = [self cellSizeForBounds:theRect];

        // Center that in the proposed rect
        float heightDelta = newRect.size.height - textSize.height;  
        if (heightDelta > 0)
        {
            newRect.size.height -= heightDelta;
            newRect.origin.y += (heightDelta / 2);
        }
    }

    return newRect;
}
于 2009-11-19T05:20:08.890 に答える