検索中にUISearchBarにUIActivityIndicatorを表示することは可能ですか?
質問する
8265 次
3 に答える
17
iOS13のアップデート。
Swift4+では以下の拡張子を使用できます。使用法:
アクティビティを表示するには:
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()
}
}
}
}
于 2017-08-27T13:14:56.660 に答える
10
はい、できます。
検索を開始したら、アクティビティインジケーターを作成し、メソッドのUISearchBar
使用のサブビューとして追加します。addSubView
検索が終了したら、メソッドを使用して検索バーから削除しますremoveFromSuperView
。
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
//set frame for activity indicator
[searchBar addSubview: spinner];
[spinner startAnimating];
別の方法については、このリンクを参照してください。
于 2012-11-07T18:19:22.507 に答える
4
宣伝されているソリューションのどれも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
}
}
}
}
于 2020-07-28T09:12:16.707 に答える