iOS:在UISearchBar中使用UIActivityIndicator

9
在搜索时,是否可以在UISearchBar中显示UIActivityIndicator?
3个回答

17

iOS 13更新。

ios13

您可以在Swift 4+中使用以下扩展程序。 用法:

显示活动: searchBar.isLoading = true

隐藏活动: searchBar.isLoading = false

UISearchBar扩展程序

extension UISearchBar {

    public var textField: UITextField? {
        if #available(iOS 13.0, *) {
            return self.searchTextField
        } else {
            let subViews = subviews.flatMap { $0.subviews }
            guard let textField = (subViews.filter { $0 is UITextField }).first as? UITextField else {
                return nil
            }
            return textField
        }
    }

    public 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()
            }
        }
    }
}

最佳答案 - Vlad Markushin
1
这是一个很好的解决方法,但在最新的iOS上看起来不太好。你有办法让它在iOS 11上看起来好看并且具有半透明导航栏吗? - jbouaziz

10

可以的。

开始搜索时,创建一个活动指示器并使用 addSubview 方法将其添加为 UISearchBar 的子视图。当搜索完成后,使用 removeFromSuperview 方法从搜索栏中删除它。

UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
//set frame for activity indicator
[searchBar addSubview: spinner];
[spinner startAnimating];

请参考此链接以获取另一种方式


5

发现没有一种广告解决方案适用于iOS13...这里是我自己的解决方案,它对搜索栏进行了子类化,并应该更加稳健以供将来使用

class SearchBar: UISearchBar {

    var activityIndicator: UIActivityIndicatorView?
    
    var isLoading: Bool {
        get {
            return activityIndicator != nil
        } set {
            if newValue {
                if activityIndicator == nil {
                    
                    guard let leftView = searchTextField.leftView else {
                        return
                    }
                    
                    let ai = UIActivityIndicatorView(style: .medium)
                    ai.frame = self.convert(leftView.frame, from: leftView.superview)
                    self.addSubview(ai)
                    
                    ai.startAnimating()
                    leftView.isHidden = true
                    activityIndicator = ai
                    
                }
            } else {
                activityIndicator?.removeFromSuperview()
                activityIndicator = nil
                
                guard let leftView = searchTextField.leftView else {
                    return
                }
                leftView.isHidden = false
            }
        }
    }
    
}

我认为这是一个更好的方法,特别是搜索栏的背景颜色会随着样式的变化而改变,并且更加适应未来的UI更新! - Odin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接