从Swift中的ViewController中调整视图及其子视图的大小和重新定位

时间:2015-03-13 17:37:04

标签: ios swift

我正在尝试让视图根据设备的屏幕分辨率自动调整自身及其子项的大小。 我发现执行此操作的唯一方法是将调整大小代码放在viewDidLayoutSubviews()函数中。将所有东西放在该函数中的问题是当我调整mainView的大小时,它会导致再次调用viewDidLayoutSubviews,从而导致无限循环。 我甚至尝试添加一个计时器并在视图完成设置时调用调整大小代码,但似乎没有任何事情发生。

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()
}

2 个答案:

答案 0 :(得分:0)

" setNeedsDisplay"是什么导致子视图再次布局。你确定那行代码是必要的吗?

我认为最容易做的事情(如果你只想重新调整一次)就是将你的调整大小代码移到viewWillAppear或只是设置类似

的东西
private var didAlreadyResize = false

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    println("viewDidLayoutSubviews")
    if !didAlreadyResize {
        handleTopBarChanged()
        didAlreadyResize = true
    }
}

答案 1 :(得分:0)

我的所有问题都发生了,因为nib文件的Use Auto Layout和Use Size Classes设置为true。这将导致代码尝试自动重新定位您的内容并阻止您调整大小或移动任何UI元素。

要修复,请单击xib文件中的视图。单击Utilities视图中的File Inspector选项卡。 取消选中“使用自动布局”和“使用大小类”。

相关问题