UIView 未调整大小以匹配设备

Posted

技术标签:

【中文标题】UIView 未调整大小以匹配设备【英文标题】:UIView not adjusting size to match device 【发布时间】:2017-04-27 16:02:47 【问题描述】:

更新:我可以通过将 init(coder) 中的代码移动到 layoutSubviews 来解决我的问题。感谢您的意见!

我有一个视图类,它基本上构建了一个棋盘,并且限制为 1:1 比例和来自其他 UI 的一定数量的点。在 init(coder) 中,我正在绘制棋盘空间,然后调用一个函数从我的控制器中绘制棋子。

但是,当我运行模拟器时,它不会根据设备加载,只会根据我当前在 Interface Builder 中选择的内容加载。

例如,我在 IB 中选择了 iPhone 7 Plus,但在 iPhone 7 上运行了模拟器,导致电路板脱离屏幕。如果我在 IB 和模拟器中都选择 iPhone 7,它可以正常工作。

我一直很难找到这个问题的答案。任何帮助将不胜感激。

Board too big on iPhone 7

Because Storyboard set to iPhone 7 Plus

应用首先在init(coder)中绘制空格:

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

    let spaces: CGFloat = CGFloat(Constants.numberOfSpaces)

    spaceMargin = 16
    spaceWidth = (bounds.width - (spaces - 1) * spaceMargin) / spaces
    spaceHeight = spaceWidth
    pawnTop = bounds.height * (-3/304)
    pawnMargin = bounds.width * (1/304)
    pawnHeight = bounds.height * (48/304)
    pawnWidth = bounds.width * (44/304)

    pawnDict = [:]
    spaceDict = [:]

    for column in 0..<Constants.numberOfSpaces 
        for row in 0..<Constants.numberOfSpaces 
            let coordinate = try! Coordinate(column: column, row: row)
            drawSpace(at: coordinate)
        
    

然后这是由我的控制器调用的:

func updateBoard() 

    guard let board = dataSource?.currentBoard() else 
        return
    

    // Remove previous pawns
    for subview in subviews 
        if let pawnView = subview as? PawnView 
            pawnView.removeFromSuperview()
        
    

    pawnDict = [:]

    // Draw new pawns based on placement in board model
    for column in 0..<Constants.numberOfSpaces 
        for row in 0..<Constants.numberOfSpaces 
            let coordinate = try! Coordinate(column: column, row: row)
            let space = board.getSpace(coordinate)
            if space.hasPawn 
                drawPawn(at: coordinate)
            
        
    

【问题讨论】:

你能展示你使用自动布局绘制空间的代码吗? 【参考方案1】:

我认为您的问题是由于UIView 不知道它在init 中的界限。查看视图生命周期here。要解决您的问题,您有两个选择:使用自动布局来绘制您的板 - 或者 - 等到视图生命周期的后期绘制它。

更多信息here

【讨论】:

此信息非常宝贵!感谢您发布它!我能够通过将我的初始化代码移动到 layoutSubviews 来让它工作 抱歉,*** 的新手。检查! :) 你明白了。谢谢!

以上是关于UIView 未调整大小以匹配设备的主要内容,如果未能解决你的问题,请参考以下文章

UIView 未调整大小以填充 iPhone 6 窗口

在 iOS 中调整 UIView 的大小

在 XIB 中查看未针对不同设备调整大小

如何使用 Autolayout 调整我的超级视图大小以匹配其子视图的大小?

将UIView中UILabel的字体大小调整为不同的设备大小

如何调整 UIView 的大小以获取大量 UILabel 并调整 UILabel 的大小以适合文本?