带有加载指示符的UISearchController

时间:2016-06-08 03:38:19

标签: ios objective-c loading uisearchcontroller

我实现了UISearchController并且我从js回调中获取数据但是当我在searchbar中录制时,需要一些时间来放置数据,所以我想知道如何实现加载indicatorUISearchController

的表格视图结果中

4 个答案:

答案 0 :(得分:10)

在Swift 3中写了这个扩展,这看起来效果很好。

extension UISearchBar {

    private var textField: UITextField? {
        return subviews.first?.subviews.flatMap { $0 as? UITextField }.first
    }

    private var activityIndicator: UIActivityIndicatorView? {
        return textField?.leftView?.subviews.flatMap{ $0 as? UIActivityIndicatorView }.first
    }

    var isLoading: Bool {
        get {
            return activityIndicator != nil
        } set {
            if newValue {
                if activityIndicator == nil {
                    let newActivityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
                    newActivityIndicator.transform = CGAffineTransform(scaleX: 0.7, y: 0.7)
                    newActivityIndicator.startAnimating()
                    newActivityIndicator.backgroundColor = UIColor.white
                    textField?.leftView?.addSubview(newActivityIndicator)
                    let leftViewSize = textField?.leftView?.frame.size ?? CGSize.zero
                    newActivityIndicator.center = CGPoint(x: leftViewSize.width/2, y: leftViewSize.height/2)
                }
            } else {
                activityIndicator?.removeFromSuperview()
            }
        }
    }
}

Loading indicator on search results controller

答案 1 :(得分:1)

针对iOS 13的更新解决方案:

extension UISearchBar {
    var textField: UITextField? {
        if #available(iOS 13.0, *) {
            return searchTextField
        } else {
           if let textField = value(forKey: "searchField") as? UITextField {
                return textField
            }
            return nil
        }
    }

    private var activityIndicator: UIActivityIndicatorView? {
        return textField?.leftView?.subviews.compactMap{ $0 as? UIActivityIndicatorView }.first
    }

    var isLoading: Bool {
        get {
            return activityIndicator != nil
        } set {
            if newValue {
                if activityIndicator == nil {
                    let newActivityIndicator = UIActivityIndicatorView(style: .gray)
                    newActivityIndicator.startAnimating()
                    if #available(iOS 13.0, *) {
                        newActivityIndicator.backgroundColor = UIColor.systemGroupedBackground
                    } else {
                        newActivityIndicator.backgroundColor = UIColor.groupTableViewBackground
                    }
                    newActivityIndicator.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)
                    textField?.leftView?.addSubview(newActivityIndicator)
                    let leftViewSize = textField?.leftView?.frame.size ?? CGSize.zero
                    newActivityIndicator.center = CGPoint(x: leftViewSize.width/2, y: leftViewSize.height/2)
                }
            } else {
                activityIndicator?.removeFromSuperview()
            }
        }
    }
}

答案 2 :(得分:0)

当您开始搜索时,您可以使用subview方法创建活动指示符并将其添加为UISearchBar addSubView

  UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];

//set your frame for activity indicator

[searchBar addSubview: spinner];

[spinner startAnimating];

完成搜索后,使用removeFromSuperView方法将其从搜索栏中删除。

答案 3 :(得分:0)

请尝试这个。可能对你有所帮助

SearchBarWithloading.h

#import <UIKit/UIKit.h>

@interface SearchBarWithloading : UISearchBar

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

@end

SearchBarWithloading.m

import "SearchBarWithloading.h"

@interface SearchBarWithloading()

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

@end


@implementation SearchBarWithloading

 - (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