iOS:UISearchBar中的UIActivityIndicator
搜索时是否可以在UI搜索栏中显示UIActivityIndicator?可以 开始搜索时,使用iOS:UISearchBar中的UIActivityIndicator,ios,xcode,search,uisearchbar,uiactivityindicatorview,Ios,Xcode,Search,Uisearchbar,Uiactivityindicatorview,搜索时是否可以在UI搜索栏中显示UIActivityIndicator?可以 开始搜索时,使用addSubView方法创建活动指示器并将其添加为ui搜索栏的子视图。完成搜索后,使用removeFromSuperView方法将其从搜索栏中删除 UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGr
addSubView
方法创建活动指示器并将其添加为ui搜索栏的子视图。完成搜索后,使用removeFromSuperView
方法将其从搜索栏中删除
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
//set frame for activity indicator
[searchBar addSubview: spinner];
[spinner startAnimating];
请参阅此链接以了解其他选项。iOS 13的更新。
您可以在Swift 4+中使用以下扩展名。
用法:
要显示活动:
searchBar.isLoading=true
要隐藏活动,请执行以下操作:
searchBar.isLoading=false
ui搜索栏扩展
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()
}
}
}
}
发现所有宣传的解决方案都不能很好地用于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 = convert(leftView.frame, from: leftView.superview)
addSubview(ai)
ai.startAnimating()
leftView.isHidden = true
activityIndicator = ai
}
} else {
activityIndicator?.removeFromSuperview()
activityIndicator = nil
guard let leftView = searchTextField.leftView else {
return
}
leftView.isHidden = false
}
}
}
}
最好的答案是这是一个很好的解决办法,但在最新的iOS上看起来不太好。你有办法让它在iOS 11和半透明导航栏上看起来好看吗?