通過遞歸獲取指定view的所有子視圖.
1. 獲取View的子視圖
使用
let subViewArr = view.getAllSubViews() // 獲取所有子視圖
let imageViewArr = view.getSubView(name: "UIImageView") // 獲取指定類名的子視圖
實現(xiàn)
extension UIView {
private static var getAllsubviews: [UIView] = []
public func getSubView(name: String) -> [UIView] {
let viewArr = viewArray(root: self)
UIView.getAllsubviews = []
return viewArr.filter {$0.className == name}
}
public func getAllSubViews() -> [UIView] {
UIView.getAllsubviews = []
return viewArray(root: self)
}
private func viewArray(root: UIView) -> [UIView] {
for view in root.subviews {
if view.isKind(of: UIView.self) {
UIView.getAllsubviews.append(view)
}
_ = viewArray(root: view)
}
return UIView.getAllsubviews
}
}
extension NSObject {
var className: String {
let name = type(of: self).description()
if name.contains(".") {
return name.components(separatedBy: ".")[1]
} else {
return name
}
}
}
2. 獲取UIAlertController的titleLabel和messageLabel
UIAlertController好用,但可自定義程度不高,例如我們想讓message文字左對齊,就需要獲取到messageLabel,但UIAlertController并沒有提供這個屬性.
我們就可以通過遞歸拿到alertTitleLabel和alertMessageLabel.
extension UIAlertController {
public var alertTitleLabel: UILabel? {
return self.view.getSubView(name: "UILabel").first as? UILabel
}
public var alertMessageLabel: UILabel? {
return self.view.getSubView(name: "UILabel").last as? UILabel
}
}
雖然通過這種方法可以拿到alertTitleLabel和alertMessageLabel.但沒法區(qū)分哪個是哪個,alertTitleLabel為默認(rèn)子控件的第一個label,如果title傳空,message傳值,alertTitleLabel和alertMessageLabel獲取到的都是message的label.
如果有更好的方法歡迎討論.