代码之家  ›  专栏  ›  技术社区  ›  Duncan Groenewald

确定NSBezierPath边界以确保在macOS上正确重新绘制的正确方法是什么

  •  0
  • Duncan Groenewald  · 技术社区  · 6 年前

    我有一些困难,找出正确的方法来确定NZBezierPath的边界,以便正确地重新绘制。

    正如你可以从下面的图片看到的那样,细细的边界线似乎落在了NSBezierPath.bounds矩形。

    处理对象拖动的代码如下:

    func offsetItemLocationBy(item: DItem, x: CGFloat, y:CGFloat)
        {
            // tell the display to redraw the old rect
            let oldBounds = item.bounds  // NSBezierPath.bounds
    
            // since the offset can be generated by both mouse moves
            // and moveUp:, moveDown:, etc.. actions, we'll invert
            // the deltaY amount based on if the view is flipped or
            // not.
            let invertDeltaY: CGFloat = self.isFlipped ? -1.0: 1.0
            let y1=y*invertDeltaY
    
            item.offsetLocationBy(x: x, y: y1) // Creates a new NSBezierPath
    
            self.setNeedsDisplay(oldBounds)
            // invalidate the new rect location so that it'll
            // be redrawn
            self.setNeedsDisplay(item.bounds)
    
        }
    

    我应该使用其他方法来计算NSBezierPath的边界吗?

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  1
  •   Duncan Groenewald    6 年前

    好吧,我刚想好了- NSBezierPath.bounds 不包括线宽。

    所以要计算正确的边界减去 lineWidth/2.0 x y 再加上 lineWidth width height .

    var bounds: NSRect {
            let b = path.bounds
            let sw = path.lineWidth/2.0
            let boundsRect = NSRect(x: b.minX-sw, y: b.minY-sw, width: b.width+2*sw, height: b.height+2*sw)
            return boundsRect
        }