我想更改搜索栏范围按钮的高度。我正在使用调整后的分段控件,并希望使范围按钮具有相同的外观。下面是我的范围按钮的屏幕截图和我想要匹配的分段控件的另一个屏幕截图。
这是我用于分段控件的代码,可能需要重新应用于搜索栏范围按钮,但不知道如何:
filterSegmentedControl.frame = CGRect(
x: filterSegmentedControl.frame.origin.x,
y: filterSegmentedControl.frame.origin.y,
width: filterSegmentedControl.frame.size.width,
height: 22)
我当前的搜索栏范围按钮:
我的分段控制:
分段控件未从 UISearchBar 界面内公开。因此,您无法控制内部分段控件的框架。如果您确实想更改框架高度,除了遍历子视图找到 UISegmentedControl 然后手动为其设置框架之外,我没有看到任何其他方法。
这是 UIView 上的一个小助手扩展,它将帮助您遍历 UISearchBar 内的子视图层次结构以查找 UISegmentedControl。
extension UIView {
func traverseSubviewForViewOfKind(kind: AnyClass) -> UIView? {
var matchingView: UIView?
for aSubview in subviews {
if aSubview.dynamicType == kind {
matchingView = aSubview
return matchingView
} else {
if let matchingView = aSubview.traverseSubviewForViewOfKind(kind) {
return matchingView
}
}
}
return matchingView
}
}
然后您可以使用此方法手动将框架设置为找到的分段控件,就像这样,
if let segmentedControl = searchBar.traverseSubviewForViewOfKind(UISegmentedControl.self) {
var segmentedControlFrame = segmentedControl.frame
segmentedControlFrame.size.height = 70
segmentedControl.frame = segmentedControlFrame
}
您可以访问左图像视图,如下所示,它是搜索栏 UITextField 的子视图
if let textField: UITextField = self.searchBar?.valueForKey("searchField") as? UITextField {
if let searchIconImageView = textField.leftView as? UIImageView {
searchIconImageView.frame = CGRect(x:0,y:0,width:14,height:14)
}
}
针对 Swift 5 更新@Sandeep 的答案:
extension UIView {
func traverseSubviewForViewOfKind<V:UIView>(_ kind: V.Type) -> V? {
for aSubview in subviews {
if let matchingView = aSubview as? V {
return matchingView
} else {
if let matchingView = aSubview.traverseSubviewForViewOfKind(kind) {
return matchingView
}
}
}
return nil
}
}
用法是相同的,但现在结果将正确输入,因此您可以设置像
apportionsSegmentWidthsByContent
这样的 UISegmentedControl 属性,而无需强制转换:
if let segmentedControl = searchBar.traverseSubviewForViewOfKind(UISegmentedControl.self) {
var segmentedControlFrame = segmentedControl.frame
segmentedControlFrame.size.height = 70
segmentedControl.frame = segmentedControlFrame
segmentedControl.apportionsSegmentWidthsByContent = true
}