- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个由 CGPoints 组成的应用程序构建元素。我有 2 个按钮:makeRectangle
和 makeTriangle
.对于构建/绘图阶段,我使用三种方法 矩形以及 的三种方法三角形内drawRect
.
我的代码被困在 drawRect
.在 if-else-statement
每次按下按钮时,每种方法都会为前一个元素交换建筑/绘图方案。
如果我已经建立了矩形 然后我点击 makeTriangle
按钮,我得到了新的三角形,但我的矩形变成了一个有一个未连接点的三角形。
是否有解决方法 否则我不应该使用 drawRect
方法?
这是 drawRect
上的 SO 帖子主题:To drawRect or not to drawRect
元素声明:
enum Element {
case point1(point: CGPoint)
case point2(point: CGPoint)
case point3(point: CGPoint)
case point4(point: CGPoint)
func coord() -> [CGPoint] {
switch self {
case .point1(let point): return [point]
case .point2(let point): return [point]
case .point3(let point): return [point]
case .point4(let point): return [point]
}
}
func buildQuadPath(path: CGMutablePath) {
switch self {
case .point1(let point): CGPathMoveToPoint(path, nil, point.x, point.y)
case .point2(let point): CGPathAddLineToPoint(path, nil, point.x, point.y)
case .point3(let point): CGPathAddLineToPoint(path, nil, point.x, point.y)
case .point4(let point): CGPathAddLineToPoint(path, nil, point.x, point.y)
CGPathCloseSubpath(path)
}
}
func buildTriPath(path: CGMutablePath) {
switch self {
case .point1(let point): CGPathMoveToPoint(path, nil, point.x, point.y)
case .point2(let point): CGPathAddLineToPoint(path, nil, point.x, point.y)
case .point3(let point): CGPathAddLineToPoint(path, nil, point.x, point.y)
default:
CGPathCloseSubpath(path)
}
}
}
func buildTriPath() -> CGMutablePath {
let path = CGPathCreateMutable()
_ = array.map { $0.buildTriPath(path) }
return path
}
func drawTriPath() {
let path = buildTriPath()
GraphicsState {
CGContextAddPath(self.currentContext, path)
CGContextStrokePath(self.currentContext)
}
}
func drawTriFill() {
let fill = buildTriPath()
GraphicsState {
CGContextAddPath(self.currentContext, fill)
CGContextFillPath(self.currentContext)
}
}
func buildQuadPath() -> CGMutablePath {
let path = CGPathCreateMutable()
_ = array.map { $0.buildQuadPath(path) }
return path
}
func drawQuadPath() {
let path = buildQuadPath()
GraphicsState {
CGContextAddPath(self.currentContext, path)
CGContextStrokePath(self.currentContext)
}
}
func drawQuadFill() {
let fill = buildQuadPath()
GraphicsState {
CGContextAddPath(self.currentContext, fill)
CGContextFillPath(self.currentContext)
}
}
var squareB: Int = 0
var triangleB: Int = 0
@IBAction func makeTriangle(sender: AnyObject?) {
....................
....................
triangleB += 1
squareB = 0
}
@IBAction func makeRectangle(sender: AnyObject?) {
....................
....................
triangleB = 0
squareB += 1
}
drawRect
方法:
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
drawBG()
GraphicsState { self.drawMyPoints() }
if squareB >= 1 && triangleB == 0 {
buildQuadPath()
drawQuadPath()
drawQuadFill()
needsDisplay = true
}
else if triangleB >= 1 && squareB == 0 {
buildTriPath()
drawTriPath()
drawTriFill()
needsDisplay = true
}
drawBorder()
}
Context.swift
文件:
import Cocoa
import CoreGraphics
extension NSView {
var currentContext : CGContext? {
get {
let unsafeContextPointer = NSGraphicsContext.currentContext()?.graphicsPort
if let contextPointer = unsafeContextPointer {
let opaquePointer = COpaquePointer(contextPointer)
let context: CGContextRef = Unmanaged.fromOpaque(opaquePointer).takeUnretainedValue()
return context }
else { return nil }
}
}
func GraphicsState(drawStuff: () -> Void) {
CGContextSaveGState(currentContext)
drawStuff()
CGContextRestoreGState(currentContext)
}
}
//the end of code
最佳答案
if (makeTriangle != nil) {
和 if (makeRectangle != nil) {
没有多大意义。根据您的评论,makerRectangle
和 makeTriangle
是按钮。通过你的语句,你正在检查它们的存在——我们可以假设它们总是存在——第一个 if 子句将始终被执行。
你想要的是:创建将由按钮执行的方法。每个方法都将设置 bool 值的组合或单个枚举值,然后通过调用 setNeedsDisplay()
告诉 View 重绘.
关于macos - 使 2 个相互矛盾的方法在 drawRect 中起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39855349/
在 Coq 中,我有两个假设 H 和 H0 ,它们相互矛盾。问题是,它们只是在某些特化方面相互矛盾,而在证明的这一刻,上下文并不是那么特化。 此时我的证明上下文如下所示: color : Vertex
根据 RubyMonk section 8.1模块只保存行为而不保存状态,类可以保存行为和状态。 然而,模块是 Ruby 中类的父类(super class)。怎么会这样? 最佳答案 哦兄弟,如果你忘
来自此处的文档:http://facebook.github.io/react/docs/pure-render-mixin.html 脚注说如果复杂数据(深层数据结构)的结构发生变化,你应该使用fo
我有一个简单的类(class) function TrueNinja() { this.vanish = function() { return this; }; } 由此创建一个新对象 var
这个问题在这里已经有了答案: How do Python's any and all functions work? (10 个答案) 关闭 4 年前。 无意中发现了Numpy中的一些东西,实在看不
这个问题在这里已经有了答案: C++ doesn't tell you the size of a dynamic array. But why? (7 个回答) 关闭3年前。 我到处都读到,在 C+
编辑以提供完整的代码示例和特定问题 我正在编写一个函数来生成股票价格的时间序列图。但是,出现以下错误 eval(expr,envir,enclos)中的错误:找不到对象'df1234' 这是该函数的示
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在阅读 Stroustrup 的 C++(1997 年第 3 版)以了解他是如何实现 RAII 的,在第 365 页上我发现了这一点: class File_ptr{ FILE* p; p
A class S is a standard-layout class if it: [class.prop]/(3.7) : has no element of the set M(S) of t
我是一名优秀的程序员,十分优秀!