我正在测试自己的用户界面,发现搜索栏有点过窄,无法满足我的需求。我还想确保视力较差或手动灵活性较差的人在调配所需界面时没有问题。
所以,我想做的是调整UITextfield内部的高度UISearchbar。
UITextfield
UISearchbar
我尝试过的操作:1.在情节提要中,添加“ UISearchbar高度限制”-结果:搜索栏大小增加,但UITextField内部保持不变。
UITextField
注意-我可以修改UITextField使用方法2的其他参数,并且更改会反映在屏幕上,因此我知道UITextField
方法2的代码放在UISearchbar所在的ViewController的viewDidLoad()中:
for tempView in (self.roomInfoSearchBar.subviews[0] as! UIView).subviews as! [UIView] { if let tV = tempView as? UITextField { var currentFrameRect = tV.frame currentFrameRect.size.height = 80 //tV.layer.backgroundColor = UIColor.blueColor().CGColor //This works fine //tV.layer.cornerRadius = 5 //This works fine //tV.font = UIFont(name: "Courier", size: 40) //This works fine println(tV.frame.height) //console output:0.0 tV.frame = currentFrameRect println(tV.frame) //console output:(0.0, 0.0, 0.0, 80.0) println(currentFrameRect) //console output:(0.0, 0.0, 0.0, 80.0) - redundant, just checking println(tV.frame.height) //console output:80.0 - it says 80, but screen shows searchbar definitely not 80. } }
我认为这与自动布局有关,无论设置在哪里,它都可以忽略参数。我想继续使用自动版式,因为它为我做了很多工作,但是我希望它的行为就像在Storyboard中一样,在该版面上,当用户设置设置时,它将在自动版式中使用这些参数,并在可以的时候抱怨。 t而不是忽略设置而没有反馈。
编辑:
为了回应马赫什。我不太了解客观的C ++,但是我尽力将您编写的内容转换为快速的内容。这就是我所拥有的:
(在我的viewcontroller.swift内部)
func viewDIdLayoutSubviews() { super.viewDidLayoutSubviews() self.roomInfoSearchBar.layoutSubviews() var topPadding: Float = 5.0 for view in (self.roomInfoSearchBar.subviews[0] as! UIView).subviews as! [UIView] { if let tfView = view as? UITextField { var calcheight = self.roomInfoSearchBar.frame.size.height - 10 tfView.frame = CGRectMake(tfView.frame.origin.x, CGFloat(topPadding), tfView.frame.size.width, self.roomInfoSearchBar.frame.size.height - CGFloat(topPadding * 2)) } } }
由于在将您的代码转换为Swift时遇到了一些问题,因此我保留了用于访问文本字段的代码。对于CGRectMake- swift抱怨各种类型,包括topPadding不是CGFloat,而对于最后一个变量(Y大小),它又不喜欢将CGFloat与Float混合,所以我也必须更改它。
不幸的是,它似乎不起作用。我在情节提要中将UISearchbar的高度更改为80,而我刚得到一个非常高的搜索栏,其文本字段覆盖了总高度的1/3。
编辑#2:合并Yuyutsu和更正的Mahesh代码版本。 仍不完美,但更接近。Yuyutsu的代码有效,但正如我的评论中所述,该字段不会居中,并且在首次加载视图时,调整大小也是可见的(从高度A跳到高度B)。另一个不足之处是,由于viewDidAppear方向改变后立即进行了大小调整,因此该字段返回到固有大小。
viewDidAppear
我基于Yuyutsu的代码:
override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) var roomInfoSearchBarFrame = roomInfoSearchBar.frame var newHeight: CGFloat = 60 for subView in roomInfoSearchBar.subviews { for subsubView in subView.subviews { if let textField = subsubView as? UITextField { var currentTextFieldFrame = textField.frame var recenteredY = (roomInfoSearchBarFrame.height - newHeight)/2 var newTextFieldFrame = CGRectMake(textField.frame.minX, recenteredY, textField.frame.width, newHeight) textField.frame = newTextFieldFrame textField.borderStyle = UITextBorderStyle.RoundedRect textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight //textField.backgroundColor = UIColor.redColor() // textField.font = UIFont.systemFontOfSize(20) } } } }
查看Yuyutsu的代码,我想知道还有什么地方可以进行此调整,并且通过另一个stackoverflow帖子遇到了链接。根据我的阅读,我看到马赫什的答案应该起作用。这就是我意识到为什么它不起作用的原因-我需要 重写func viewWillLayoutSubviews()。
func viewWillLayoutSubviews()
当前代码:保持尺寸随方向变化。 但是大小跳转仍然可见(不应该看到)
override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() var roomInfoSearchBarFrame = roomInfoSearchBar.frame var newHeight: CGFloat = 60 for subView in roomInfoSearchBar.subviews { for subsubView in subView.subviews { if let textField = subsubView as? UITextField { var currentTextFieldFrame = textField.frame var recenteredY = (roomInfoSearchBarFrame.height - newHeight)/2 var newTextFieldFrame = CGRectMake(textField.frame.minX, recenteredY, textField.frame.width, newHeight) textField.frame = newTextFieldFrame textField.borderStyle = UITextBorderStyle.RoundedRect textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight //textField.backgroundColor = UIColor.redColor() // textField.font = UIFont.systemFontOfSize(20) } } } }
因此,现在,剩下的唯一事情就是尝试使文本字段成为视图可见之前的设置大小,因此用户看不到任何大小偏移。
最终编辑:完全有效的代码 在Yuyutsu的附加帮助下,以下代码可以完成我想要的一切-从设置的大小开始,以字段为中心,并很好地处理旋转。
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() self.roomInfoSearchBar.layoutIfNeeded() self.roomInfoSearchBar.layoutSubviews() var roomInfoSearchBarFrame = roomInfoSearchBar.frame var newHeight: CGFloat = 60 //desired textField Height. for subView in roomInfoSearchBar.subviews { for subsubView in subView.subviews { if let textField = subsubView as? UITextField { var currentTextFieldBounds = textField.bounds currentTextFieldBounds.size.height = newHeight textField.bounds = currentTextFieldBounds textField.borderStyle = UITextBorderStyle.RoundedRect //textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight } } } }
谢谢Yuyutsu。感谢Mahesh从一开始就提出最终解决方案,只是缺少了一些关键点。
override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) for subView in searchBars.subviews { for subsubView in subView.subviews { if let textField = subsubView as? UITextField { var bounds: CGRect bounds = textField.frame bounds.size.height = 35 //(set height whatever you want) textField.bounds = bounds textField.borderStyle = UITextBorderStyle.RoundedRect // textField.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight textField.backgroundColor = UIColor.redColor() // textField.font = UIFont.systemFontOfSize(20) } } } }
这可能对您有帮助:)