Ios 调整视图的大小并重新定位它';在Swift中从其ViewController中选择子对象
我正在尝试让视图根据设备的屏幕分辨率自动调整自身及其子视图的大小。 我发现实现这一点的唯一方法是将调整大小代码放入viewdilayoutsubviews()函数中。将所有内容放入该函数的问题是,当我调整mainView的大小时,它会导致再次调用ViewDidLayoutSubView,从而导致无限循环。 我甚至尝试添加一个计时器,并在视图完成自身设置后调用resize代码,但似乎什么也没发生Ios 调整视图的大小并重新定位它';在Swift中从其ViewController中选择子对象,ios,swift,Ios,Swift,我正在尝试让视图根据设备的屏幕分辨率自动调整自身及其子视图的大小。 我发现实现这一点的唯一方法是将调整大小代码放入viewdilayoutsubviews()函数中。将所有内容放入该函数的问题是,当我调整mainView的大小时,它会导致再次调用ViewDidLayoutSubView,从而导致无限循环。 我甚至尝试添加一个计时器,并在视图完成自身设置后调用resize代码,但似乎什么也没发生 class PeopleVC: { @IBOutlet weak var mainView: UIV
class PeopleVC:
{
@IBOutlet weak var mainView: UIView!
var topNav:TopNavigationView!
@IBOutlet weak var peopleTable: UITableView!
@IBOutlet weak var searchTextField: UITextField!
let simpleTableIdentifier = "TableViewCell"
var currentList:[Contact]!
override func viewDidLoad()
{
super.viewDidLoad()
self.navigationController?.navigationBarHidden = true
self.view.backgroundColor = utils.UIColorFromRGB(0x2B383E)
topNav = TopNavigationView(frame: CGRectMake(0, 0, 1024, 1))
self.view.addSubview(topNav)
topNav.redrawCallback = handleTopBarChanged
topNav.setup(self)
currentList = dataMgr.contacts.contactList
var nib = UINib(nibName: "PeopleCell", bundle: nil)
peopleTable.registerNib(nib, forCellReuseIdentifier: "peopleCell")
var timer = NSTimer.scheduledTimerWithTimeInterval( 5 , target: self, selector: "resizeEverything", userInfo: nil, repeats: false)
}
override func viewDidAppear(animated: Bool)
{
super.viewDidAppear(animated)
println("viewDidAppear")
}
override func updateViewConstraints()
{
super.updateViewConstraints()
println("updateViewConstraints")
}
override func viewWillLayoutSubviews()
{
super.viewWillLayoutSubviews()
println("viewWillLayoutSubviews")
}
override func viewDidLayoutSubviews()
{
super.viewDidLayoutSubviews()
println("viewDidLayoutSubviews")
handleTopBarChanged()
}
func handleTopBarChanged()
{
mainView.frame.origin.y = topNav.getBottom() + 1
}
func resizeEverything()
{
println("resizeEverything")
mainView.frame.origin.y = 200
self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, dataMgr.screenSize.width, dataMgr.screenSize.height)
mainView.frame = CGRectMake(mainView.frame.origin.x, mainView.frame.origin.y, dataMgr.screenSize.width, dataMgr.screenSize.height - mainView.frame.origin.y)
peopleTable.frame = CGRectMake(peopleTable.frame.origin.x, peopleTable.frame.origin.y, dataMgr.screenSize.width, dataMgr.screenSize.height - mainView.frame.origin.y)
self.view.setNeedsDisplay()
}
“setNeedsDisplay”是导致子视图再次布局的原因。您确定这行代码是必需的吗
我认为最简单的方法(如果您只想调整一次大小)是将调整大小代码移动到ViewWillDisplay,或者简单地设置如下内容
private var didAlreadyResize = false
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
println("viewDidLayoutSubviews")
if !didAlreadyResize {
handleTopBarChanged()
didAlreadyResize = true
}
}
我所有的问题都发生了,因为nib文件的Use Auto Layout和Use Size Classes设置为true。这将导致代码尝试自动重新定位您身上的内容,并阻止您调整或移动任何UI元素 要修复此问题,请单击xib文件中的视图。单击“实用程序”视图中的“文件检查器”选项卡。
取消选中“使用自动布局”和“使用大小类”。否,它在没有设置需要的情况下发生显示,我将其放入,试图强制屏幕重新绘制。我希望能有一个比挂国旗更简单的方法。