5

画像とタイトルの両方を持つ NSButton を作成する必要がありましたが、ココアの標準的な配置方法がどれも好きではありませんでした。

ボタン セルをサブクラス化してオーバーライドし-imageRectForBounds:-titleRectForBounds:独自の位置を提供することにしました。問題は、-titleRectForBounds:メソッドが正常に呼び出されることですが、-imageRectForBounds:そうではありません。

ボタンの画像は通常どおり表示されるため、セルには画像を描画するためのフレームが必要です。どこから取得するのかわかりません。

コードは実にシンプルです。現時点で私がしたことは、NSButtonCell をサブクラス化し、これら 2 つのメソッドをオーバーライドすることだけです。次に、IB で NSButton を選択し、そのセル クラスをカスタム ボタン セルに変更します。

コードは次のとおりです。

#import "JSButtonCell.h"

@implementation JSButtonCell

- (NSRect)titleRectForBounds:(NSRect)theRect
{
    NSLog(@"Bounds for title");
    NSLog(@"%@",NSStringFromRect(theRect));
    NSRect titleRect = [super titleRectForBounds:theRect];
    NSLog(@"Title rect");
    NSLog(@"%@",NSStringFromRect(titleRect));
    return titleRect;
}

- (NSRect)imageRectForBounds:(NSRect)theRect
{
    NSLog(@"Bounds for image");
    NSLog(@"%@",NSStringFromRect(theRect));
    NSRect imageRect = [super imageRectForBounds:theRect];
    NSLog(@"Image rect");
    NSLog(@"%@",NSStringFromRect(imageRect));
    imageRect.origin.y -= 20;
    return imageRect;
}

@end
4

1 に答える 1

2

デバッグがほとんどないので、デフォルトのNSButtonCell実装は を呼び出さないことを理解していますdrawImage:withFrame:inView:。なんで?フォーラムでもAppleのドキュメントでも答えが見つかりません(誰かが説明してくれたら-私は幸せです:)。drawImage:withFrame:inView:私は単にオーバーライドして呼び出すことでこの問題を解決しましたimageRectForBounds:

- (void)drawImage:(NSImage *)image withFrame:(NSRect)frame inView:(NSView *)controlView
{
    [super drawImage:image withFrame:[self imageRectForBounds:frame] inView:controlView];
}
于 2013-12-14T11:03:37.197 に答える