【问题标题】:UIBezierPath draws differently in storyboard and simulatorUIBezierPath 在故事板和模拟器中绘制不同
【发布时间】:2021-03-11 15:51:14
【问题描述】:

我正在创建一个自定义IBDesignable 控件,我想在其中绘制一组正方形。我有一个draw(_ rect:) 方法,它执行以下操作:

override func draw(_ rect: CGRect) {

        // ... skipped ...
        
        for i in 0 ..< 7 {
            for j in 0 ... 6 {

                let x = Double(i) * (cellSize + space)
                let y = Double(j) * (cellSize + space)
                
                let rectangle = CGRect(x: x, y: y, width: cellSize, height: cellSize)
                let face = UIBezierPath(roundedRect: rectangle, cornerRadius: CGFloat(0))

                face.fill()
            }
        }
    }

当我将组件添加到界面构建器中时,这工作得很好,我可以看到方块。但是当我在模拟器中运行它时,它会绘制矩形,但 不是正方形

这看起来很奇怪,因为width 等于height。即使我用线条画,它的工作方式也是一样的:

let face = UIBezierPath()
face.move(to: CGPoint(x: x, y: y))
face.addLine(to: CGPoint(x: x + cellSize, y: y))
face.addLine(to: CGPoint(x: x + cellSize, y: y + cellSize))
face.addLine(to: CGPoint(x: x, y: y + cellSize))
face.close()

或者如果我使用常规的非圆角矩形:

let face = UIBezierPath(rect: rectangle)

有什么想法可能是错的吗?

【问题讨论】:

    标签: ios swift uibezierpath ibdesignable


    【解决方案1】:

    问题在于时间。视图是使用正方形绘制的,但随后会布置界面,并且视图高度会变小一点或宽度会变大一点。绘图被缓存——当它的边界发生变化时,你没有将视图设置为redrawn——所以现在绘图稍微变形了,就好像一个比例变换已经应用到它上面,水平值与垂直值不同。因此,正方形不再是正方形。

    【讨论】:

    • 好像是这样。通过在更改边界时强制重绘来修复。
    • 您不需要“强制”它。这是一个内置的设置。但是你没有打开它。见developer.apple.com/documentation/uikit/uiview/contentmode/…
    • 好吧,这行得通。但是如果我想让这个对其他人“透明”呢?这样当他们向 IB 添加视图时,他们不需要更改设置。
    猜你喜欢
    • 1970-01-01
    • 2015-02-22
    • 2013-01-16
    • 1970-01-01
    • 2018-04-25
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多