无法从自定义搜索栏修改高度UITextField

时间:2016-02-04 22:36:25

标签: ios swift uisearchbar

首先,我已经查看this问题并试图实现它,但它没有改变任何内容,所以我只是在这段代码中展示自己的尝试。

就像问题所说我试图改变搜索栏内UITextField的高度。我已经制作了自定义搜索栏以及自定义搜索控制器。

搜索栏类看起来像这样

class CustomSearchBar: UISearchBar {

var preferredFont: UIFont!
var preferredTextColor: UIColor!

override func drawRect(rect: CGRect) {
    // Drawing code

    // Find the index of the search field in the search bar subviews.
    if let index = indexOfSearchFieldInSubviews() {
        // Access the search field
        let searchField: UITextField = (subviews[0]).subviews[index] as! UITextField


        // Set its frame.
        //searchField.frame = CGRectMake(5.0, 5.0, frame.size.width - 10.0, frame.size.height - 10.0)
        searchField.frame = CGRectMake(5.0, 5.0, frame.size.width, 100)

        // Set the font and text color of the search field.
        searchField.font = preferredFont
        searchField.textColor = preferredTextColor

        // Set the background color of the search field.
        searchField.backgroundColor = barTintColor
    }

    let startPoint = CGPointMake(0.0, frame.size.height)
    let endPoint = CGPointMake(frame.size.width, frame.size.height)
    let path = UIBezierPath()
    path.moveToPoint(startPoint)
    path.addLineToPoint(endPoint)

    let shapeLayer = CAShapeLayer()
    shapeLayer.path = path.CGPath
    shapeLayer.strokeColor = preferredTextColor.CGColor
    shapeLayer.lineWidth = 2.5

    layer.addSublayer(shapeLayer)

    super.drawRect(rect)
}

init(frame: CGRect, font: UIFont, textColor: UIColor){
    super.init(frame: frame)

    self.frame = frame
    preferredFont = font
    preferredTextColor = textColor

    searchBarStyle = UISearchBarStyle.Prominent
    translucent = false
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

func indexOfSearchFieldInSubviews() -> Int! {
    var index: Int!
    let searchBarView = subviews[0]

    for var i=0; i<searchBarView.subviews.count; ++i {
        if searchBarView.subviews[i].isKindOfClass(UITextField) {
            index = i
            break
        }
    }

    return index
}

}

我的自定义searchController看起来像这样

class CustomSearchController: UISearchController, UISearchBarDelegate {
var customSearchBar: CustomSearchBar!
var customDelegate: CustomSearchControllerDelegate!

init(searchResultsController: UIViewController!, searchBarFrame: CGRect, searchBarFont: UIFont, searchBarTextColor: UIColor, searchBarTintColor: UIColor){
    super.init(searchResultsController: searchResultsController)

    configureSearchBar(searchBarFrame, font: searchBarFont, textColor: searchBarTextColor, bgColor: searchBarTintColor)

}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?){
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

func configureSearchBar(frame: CGRect, font: UIFont, textColor:UIColor, bgColor: UIColor){
    customSearchBar = CustomSearchBar(frame: frame, font: font, textColor: textColor)

    customSearchBar.barTintColor = bgColor
    customSearchBar.tintColor = textColor
    customSearchBar.showsBookmarkButton = true
    customSearchBar.setImage(UIImage(named: "recording.png"), forSearchBarIcon: UISearchBarIcon.Bookmark, state: UIControlState.Normal)
    customSearchBar.setImage(UIImage(named:"record_tap.png"), forSearchBarIcon: UISearchBarIcon.Bookmark, state: UIControlState.Selected)
    customSearchBar.showsCancelButton = false

    customSearchBar.delegate = self

}

在我正在创建此搜索栏的视图控制器中,我使用以下代码。在我的viewDidLoad()

中调用
func configureCustomSearchController() {
    customSearchController = CustomSearchController(searchResultsController: self, searchBarFrame: CGRectMake(0.0, 0.0, UIScreen.mainScreen().bounds.width, 100.0), searchBarFont: UIFont(name: "Futura", size: 18.0)!, searchBarTextColor: UIColor(red: 0.612, green: 0.984, blue: 0.533, alpha: 1), searchBarTintColor: UIColor.blackColor())

    customSearchController.customSearchBar.placeholder = "Search.."
    tblSearchResults.tableHeaderView = customSearchController.customSearchBar
    customSearchController.customDelegate = self
}

我能够更改整个搜索栏的框架,请参阅上面我设置的内容。但是我无法更改我想要更大的UITextField的高度。我也确定我到达了UITextView。当我更改drawRect函数中的颜色时,它会改变。只是高度是这里的问题。有人知道我做错了什么或我需要做些什么来实现这个目标。

1 个答案:

答案 0 :(得分:1)

我发现如果将您的大小调整代码移动到layoutSubviews()中,我认为它可以按预期工作。

override func layoutSubviews() {
    // Find the index of the search field in the search bar subviews.
    if let index = indexOfSearchFieldInSubviews() {
        ... //Added red background
    }
}

override func drawRect(rect: CGRect) {...

我相信在调用drawRect()时,布局的时间已经过去了。我不能真的评论这是否是最好的实现。

Reveal