3

アドレスを入力してネットワーク接続を確立するために UISearchBar を使用します。接続が確立されている間、検索バーの右側にある小さな BookmarkButton の代わりに、アクティビティ インジケーターを表示したいと考えています。私が見る限り、検索バーの正しいサブビューにアクセスできるパブリック宣言されたプロパティはありません。私はこれが行われたのを見ました、何か考えはありますか?

4

6 に答える 6

10

検索または接続の進行中に、左側の検索アイコンをアクティビティ インジケーターに置き換えてみませんか?

SearchBarWithActivity.h:

#import <UIKit/UIKit.h>

@interface SearchBarWithActivity : UISearchBar

- (void)startActivity;  // increments startCount and shows activity indicator
- (void)finishActivity; // decrements startCount and hides activity indicator if 0

@end

SearchBarWithActivity.m:

#import "SearchBarWithActivity.h"

@interface SearchBarWithActivity()

@property(nonatomic) UIActivityIndicatorView *activityIndicatorView;
@property(nonatomic) int startCount;

@end


@implementation SearchBarWithActivity

- (void)layoutSubviews {
    UITextField *searchField = nil;

    for(UIView* view in self.subviews){
        if([view isKindOfClass:[UITextField class]]){
            searchField= (UITextField *)view;
            break;
        }
    }

    if(searchField) {
        if (!self.activityIndicatorView) {
            UIActivityIndicatorView *taiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
            taiv.center = CGPointMake(searchField.leftView.bounds.origin.x + searchField.leftView.bounds.size.width/2,
                                      searchField.leftView.bounds.origin.y + searchField.leftView.bounds.size.height/2);
            taiv.hidesWhenStopped = YES;
            taiv.backgroundColor = [UIColor whiteColor];
            self.activityIndicatorView = taiv;
            [taiv release];
            _startCount = 0;

            [searchField.leftView addSubview:self.activityIndicatorView];
        }
    }

    [super layoutSubviews];
}

- (void)startActivity  {
    self.startCount = self.startCount + 1;
}

- (void)finishActivity {
    self.startCount = self.startCount - 1;
}

- (void)setStartCount:(int)startCount {
    _startCount = startCount;
    if (_startCount > 0)
        [self.activityIndicatorView startAnimating];
    else {
        [self.activityIndicatorView stopAnimating];
    }
}

@end
于 2012-03-31T20:59:00.630 に答える
2

@JohnLemberger からの回答を更新して、iOS 7 で動作するようにしました (注: これは iOS 7 でのみテストしました)。

UISearchBar注: Apple はどのリリースでも (iOS 6 と 7 の間で行ったように)のビュー階層を変更できるため、これはそもそもあまり堅牢なコードではありません。

SearchBarWithActivity.h (何も変更されていません):

@interface SearchBarWithActivity : UISearchBar

- (void)startActivity;  // increments startCount and shows activity indicator
- (void)finishActivity; // decrements startCount and hides activity indicator if 0

@end

@interface XXTreatmentHeaderViewController : XXViewController

@property (nonatomic, strong, readonly) SearchBarWithActivity *searchBar;

@end

SearchBarWithActivity.m:

1) アクティビティ インジケーターが表示されたときの「虫めがね」アイコンの表示/非表示

2) ビュー階層検索に深さを追加して、UITextField

@interface SearchBarWithActivity()

@property(nonatomic) UIActivityIndicatorView *activityIndicatorView;
@property(nonatomic) int startCount;

@end

@implementation SearchBarWithActivity

- (void)layoutSubviews {
    UITextField *searchField = nil;

    for(UIView* view in self.subviews){

        // on iOS 6, the UITextField is one-level deep
        if ([view isKindOfClass:[UITextField class]]){
            searchField= (UITextField *)view;
            break;
        }

        // on iOS 7, the UITextField is two-levels deep
        for (UIView *secondLevelSubview in view.subviews) {
            if([secondLevelSubview isKindOfClass:[UITextField class]]){
                searchField= (UITextField *)secondLevelSubview;
                break;
            }
        }
    }

    if(searchField) {
        if (!self.activityIndicatorView) {
            UIActivityIndicatorView *taiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
            taiv.center = CGPointMake(searchField.leftView.bounds.origin.x + searchField.leftView.bounds.size.width/2,
                                      searchField.leftView.bounds.origin.y + searchField.leftView.bounds.size.height/2);
            taiv.hidesWhenStopped = YES;
            self.activityIndicatorView = taiv;
            _startCount = 0;

            [searchField.leftView addSubview:self.activityIndicatorView];
        }
    }

    [super layoutSubviews];
}

- (void)startActivity  {
    self.startCount = self.startCount + 1;
}

- (void)finishActivity {
    self.startCount = self.startCount - 1;
}

- (void)setStartCount:(int)startCount {
    _startCount = startCount;
    if (_startCount > 0) {
        [self.activityIndicatorView startAnimating];
        // Remove the "magnifying glass icon"
        [self setImage:[UIImage new] forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];
    } else {
        [self.activityIndicatorView stopAnimating];
        // Restore the "magnifying glass icon"
        [self setImage:nil forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];
    }
}

@end
于 2014-01-10T17:43:28.490 に答える
2

AFNetworking のリクエスト操作またはセッション タスクhttps://gist.github.com/nguyenhuy/a11d15c11200477b05a6の状態に応じて、UISearchBarを表示するカテゴリを実装しました。UIActivityIndicatorView

于 2014-07-15T15:06:52.430 に答える
1

記録のために:

for(UIView* view in self.subviews){
    if([view isKindOfClass:[UITextField class]]){
       searchField=view;
       break;
    }
}

if(searchField !=)) {
   searchField.leftView = myCustomView;
}

UISearchBar をサブクラス化し、layoutSubview メソッドでこのコードを呼び出すことができます。このコードを layoutSubview で呼び出すと、アニメーションのサイズ変更が適切に機能することが保証されます。

于 2010-04-26T19:24:13.113 に答える
0

UITextField の深さが変化し続けているように見えるので、再帰的なソリューションを追加すると考えました。

-(NSArray * ) findAllSubviewsForView:(UIView * ) view{
    NSMutableArray * views = [[NSMutableArray alloc] init];

    for(UIView * subview in view.subviews){
        [views addObjectsFromArray:[self findAllSubviewsForView:subview]];
    }
    [views addObject:view];
    return views;
}

この配列を使用して、UITextField を見つけることができます。

UITextField * searchField = nil;
for(UIView * view in [self findAllSubviewsForView:self]){
     if([view isKindOfClass:[UITextField class]]){
          searchField = (UITextField *) view;
      }
 }
于 2014-08-15T01:52:02.440 に答える
0

私は、displaySearchBarInNavigationBar フラグを使用してUISearchBarが UINavigationBar に埋め込まれている場合のサポートを追加することで、 jonsibley の回答を更新します。

SearchBarWithActivity.h (新しいプロパティを追加):

@interface SearchBarWithActivity : UISearchBar

- (void)startActivity;  // increments startCount and shows activity indicator
- (void)finishActivity; // decrements startCount and hides activity indicator if 0

@property (nonatomic,assign) UINavigationItem *navigationItem;

@end

SearchBarWithActivity.m (nil でない場合は、navigationItem から searchField を取得します):

#import "SearchBarWithActivity.h"

@interface SearchBarWithActivity()

@property(nonatomic) UIActivityIndicatorView *activityIndicatorView;
@property(nonatomic) int startCount;

@end

@implementation SearchBarWithActivity

@synthesize navigationItem;

- (void)layoutSubviews {
    UITextField *searchField = nil;

    if(self.navigationItem) {
        searchField = (UITextField *)[self.navigationItem titleView];
    } else {
        for(UIView* view in self.subviews){

            // on iOS 6, the UITextField is one-level deep
            if ([view isKindOfClass:[UITextField class]]){
                searchField= (UITextField *)view;
                break;
            }

            // on iOS 7, the UITextField is two-levels deep
            for (UIView *secondLevelSubview in view.subviews) {
                if([secondLevelSubview isKindOfClass:[UITextField class]]){
                    searchField= (UITextField *)secondLevelSubview;
                    break;
                }

            }
        }
    }

    if(searchField) {
        if (!self.activityIndicatorView) {
            UIActivityIndicatorView *taiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
            taiv.center = CGPointMake(searchField.leftView.bounds.origin.x + searchField.leftView.bounds.size.width/2,
                                      searchField.leftView.bounds.origin.y + searchField.leftView.bounds.size.height/2);
            taiv.hidesWhenStopped = YES;
            self.activityIndicatorView = taiv;
            _startCount = 0;

            [searchField.leftView addSubview:self.activityIndicatorView];
        }
    }

    [super layoutSubviews];
}

- (void)startActivity  {
    self.startCount = self.startCount + 1;
}

- (void)finishActivity {
    self.startCount = self.startCount - 1;
}

- (void)setStartCount:(int)startCount {
    _startCount = startCount;
    if (_startCount > 0) {
        [self.activityIndicatorView startAnimating];
        // Remove the "magnifying glass icon"
        [self setImage:[UIImage new] forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];
    } else {
        [self.activityIndicatorView stopAnimating];
        // Restore the "magnifying glass icon"
        [self setImage:nil forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];
    }
}

@end

あなたのViewControllerで:

#import "SearchBarWithActivity.h"

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Embed the search bar into NavigationBar and setup the navigation item in order to show the spinner
    [self.searchDisplayController setDisplaysSearchBarInNavigationBar:YES];
    [(SearchBarWithActivity *)self.searchDisplayController.searchBar setNavigationItem:self.navigationItem];
}

これが誰かの時間を節約することを願っています。

于 2014-02-16T07:40:50.277 に答える