0

Ecoute 3.0と同じように、NSSearchFieldを作成したいと思います。検索フィールドの検索アイコンはクリック可能で、クリックすると展開したり折りたたんだりする必要があります。

ここに画像の説明を入力してください ここに画像の説明を入力してください

どうすればこれを達成できますか?ドキュメントを検索しましたが、役立つものは何も見つかりませんでした。アニメータープロキシを使用して拡張を実装できるので、それは明らかです。

もう1つは、背景が拡大/縮小すると、背景がフェードイン/フェードアウトすることです。どうすればこれを達成できますか?

アドバイスやサンプルコードなどをいただければ幸いです。

編集

わかりました、私は最初の部分を自分で見つけました。

- (void) resetSearchButtonCell {
    NSButtonCell *c= [[NSButtonCell alloc] init];
    [c setButtonType:NSMomentaryChangeButton];  // configure the button
    [c setBezelStyle:NSRegularSquareBezelStyle];    // configure the button
    [c setBordered:NO];
    [c setBezeled:NO];
    [c setEditable:NO];
    [c setImagePosition:NSImageOnly];
    [c setImage:[NSImage imageNamed:@"search"]];
    [c setAlternateImage:[NSImage imageNamed:@"search-pushed"]];
    [c setTarget:self];
    [c setAction:@selector(_search:)];
    [self setSearchButtonCell:c];
}

これで、プロパティを作成しました。isCollapsedこれを切り替えます_search:。そして、setIsCollapsed:セッターメソッドでは、次のことを行います。

NSRect newRect = self.frame;

if (_isCollapsed) {
    newRect.size.width = kCollapsedWidth;
} else {
    newRect.size.width = kEXpandedWidth;
}

[[self animator] setFrameSize:newRect.size];

しかし、何らかの理由で、NSSearchFieldがフォーカスを取得または失うと、フレームはInterfaceBuilderで設定された初期サイズにリセットされます。

誰か教えてもらえますか?

編集

私もその問題を解決しました。アニメーションを台無しにしたのは自動レイアウトでした。現在、残っているのはbackground-alphaだけで、これは変更する必要があります。全体を再描画することはできますが、背景とキャンセルボタンのみのアルファを変更できる別の解決策はありますか?

4

2 に答える 2

1

似たようなことをしたかった。ITSearchFieldは非常に堅実で素晴らしいです。しかし、焦点が合ったら検索フィールドを拡大したいと思いました。すぐにわかるように、NSSearchfieldは多くのコンポーネントとレイヤーで構成されています。

これが私がそれを機能させるために書いたものです...注:それは10.7以上で動作します。また、IBでの検索フィールドコントロールの幅のレイアウト制約をアウトレットに接続する必要があります。

.h

@interface MySearchField : NSSearchField 
@end

.m

#pragma mark - Implementation: Search Field Control

@interface MySearchField()
@property (readwrite, nonatomic, getter=isExpanded) BOOL expand;
@property (readwrite, nonatomic, getter=hasFocusRing) BOOL focusRing;
@property (readwrite, strong, nonatomic) NSTimer *expandTimer;
@property (readwrite, strong, nonatomic) IBOutlet NSLayoutConstraint *widthConstraint;
@property (readwrite, nonatomic) CGFloat searchWidth;
@end

static NSTimeInterval const kSearchFieldTime = 0.5;

@implementation MySearchField

@synthesize expand, focusRing;
@synthesize expandTimer, searchWidth;
@synthesize widthConstraint;

#pragma mark Timer Methods:

- (void) resizeSearchField {


    if ( self.hasFocusRing ) {

        if ( !self.isExpanded ) {

            self.searchWidth = self.widthConstraint.constant;
            [[self.widthConstraint animator] setConstant:(self.searchWidth * 2)];
            self.expand = YES;

    } } else {

        if ( (self.isExpanded) &&
            ((!self.stringValue) || ([self.stringValue isEqualToString:@""])) ) {

            [[self.widthConstraint animator] setConstant:self.searchWidth];
            self.expand = NO;
    } }
}

- (void) stopTimer {

    if ( self.expandTimer )
        [self.expandTimer invalidate];

    self.expandTimer = nil;
}

- (void) startTimer {

    [self stopTimer];

    SEL resizeSelector = @selector(resizeSearchField);
    NSMethodSignature *expandSignature = [MySearchField instanceMethodSignatureForSelector:resizeSelector];
    NSInvocation *expandInvocation = [NSInvocation invocationWithMethodSignature:expandSignature];
    [expandInvocation setSelector:resizeSelector];
    [expandInvocation setTarget:self];

    self.expandTimer = [NSTimer scheduledTimerWithTimeInterval:kSearchFieldTime invocation:expandInvocation repeats:NO];
}

#pragma mark Override Methods:

- (void) noteFocusRingMaskChanged {

    self.focusRing = !NSEqualRects(NSZeroRect, self.focusRingMaskBounds);
    [self startTimer];
    [super noteFocusRingMaskChanged];
}

@end

本当にそれだけです。フォーカスリングが変わると通知を受け取り、クイックタイマー方式を開始します。タイマーは、検索フィールドのキャンセルボタンをクリックしてコントロールをリセットするときに必要です。タイマーが行う唯一のことは、resizeSearchFieldメソッドを起動することです。

更新:そうそう、IBの検索フィールドコントロールのクラスをMySearchFieldまたはあなたがそれを呼びたいものに設定することを忘れないでください。

楽しみ!

于 2013-01-04T16:43:48.560 に答える
0

背景を描き直してしまいました。このように、アルファを設定することができました。

ソースコードはGithubで入手できます。

https://github.com/iluuu1994/ITSearchField

于 2012-12-30T13:04:11.960 に答える