- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个并排的函数,它们循环不断地绘制两个 UIBezierPaths,问题是,它们每个都有不同的颜色,所以我经常需要重申 UIColor.blackColor().setFill()
和 UIColor(patternImage: UIImage(named: "normalpaper.jpg")).setFill()
,缺点是它使控制台无法读取,因为它会无休止地向您发送警告消息。
<Error>: CGContextRestoreGState: invalid context 0x0. This is a serious error.
This application, or a library it uses, is using an invalid context and is thereby
contributing to an overall degradation of system stability and reliability. This
notice is a courtesy: please fix this problem. It will become a fatal error in an
upcoming update.
因此,这是我的问题,有没有一种方法可以做到这一点,而不会将此警告消息发送到我的控制台?也许是一种使警告消息不会出现的方法? (无法通过搜索找到一个)或者可能是一种省略消息的方式?非常感谢任何输入,感谢阅读 -Zach。
-
如果你需要绘图函数
,它们在下面
func drawCircle() {
//Setting the draw color
UIColor.blackColor().setFill()
// Creating the rectangle's size
var drawRect = roundDrawRect(10.0, angle: 7)
//Incrementing the coords
++y
++x
//Drawing the rectangle
drawRect.fill()
}
func eraseCircle() {
//Setting the eraser color
UIColor(patternImage: UIImage(named: "normalpaper.jpg")).setFill()
//Decrementing the coords
eraseX = x - 2
eraseY = y - 2
// Creating the rectangle's size
var eraseRect = roundEraseRect(10.0, angle: 7)
//Drawing the rectangle
eraseRect.fill()
}
下面是完整的 CircleView 类(我对编程还是很陌生,所以它可能效率很低)
//Creating a view capable of painting the circle
class CircleView: UIView {
//Starting X Pos
var x: CGFloat = 100
var eraseX: CGFloat = 100
//Starting Y Pos
var y: CGFloat = 100
var eraseY: CGFloat = 100
//Starting the loop of functions
override func drawRect(rect: CGRect) {
//Creating the looping draw timer
NSTimer.scheduledTimerWithTimeInterval(
0.2,
target: self,
selector: Selector("timerDraw"),
userInfo: nil,
repeats: true)
//Creating the looping erase timer
NSTimer.scheduledTimerWithTimeInterval(
0.3,
target: self,
selector: Selector("timerErase"),
userInfo: nil,
repeats: true)
}
func drawCircle() {
//Setting the draw color
UIColor.blackColor().setFill()
// Creating the rectangle's size
var drawRect = roundDrawRect(10.0, angle: 7)
//Incrementing the coords
++y
++x
//Drawing the rectangle
drawRect.fill()
}
func eraseCircle() {
//Setting the eraser color
UIColor(patternImage: UIImage(named: "normalpaper.jpg")).setFill()
//Decrementing the coords
eraseX = x - 2
eraseY = y - 2
// Creating the rectangle's size
var eraseRect = roundEraseRect(10.0, angle: 7)
//Drawing the rectangle
eraseRect.fill()
}
func timerDraw(){
//DO DRAW LOOP HERE
drawCircle()
}
func timerErase(){
//DO ERASE LOOP HERE
eraseCircle()
}
//Defining the rounded rect erasing (Circle)
func roundEraseRect(radius: CGFloat, angle: CGFloat) -> UIBezierPath {
//Creating the rounded rect (Circle)
var roundedRect = UIBezierPath()
roundedRect.moveToPoint(CGPointMake(eraseX,eraseY))
println(CGPointMake(eraseX,eraseY))
roundedRect.addArcWithCenter(CGPointZero, radius: radius,
startAngle: 0, endAngle: angle ,
clockwise: true)
return roundedRect
}
//Defining the rounded rect drawing (Circle)
func roundDrawRect(radius: CGFloat, angle: CGFloat) -> UIBezierPath {
//Creating the rounded rect (Circle)
var roundedRect = UIBezierPath()
roundedRect.moveToPoint(CGPointMake(x,y))
roundedRect.addArcWithCenter(CGPointZero, radius: radius,
startAngle: 0, endAngle: angle ,
clockwise: true)
return roundedRect
}
}
class ViewController: UIViewController {
最佳答案
Apple 的 Drawing and Printing Guide for iOS解释了所有这些,我强烈建议在进一步使用自定义绘图代码之前阅读它。至少,请阅读有关 iOS Drawing Concepts 的部分.
问题是您在 CircleView
的 drawRect
函数中创建并触发了 NSTimer
。绘图调用只能在正确的上下文中进行(这实际上是您看到它试图告诉您的错误)。通过在从 NSTimer
调用的函数中进行绘图,您实际上是在 您的 drawRect
函数中进行绘图,并且没有有效的在这种情况下绘制上下文。另外,按照现在的代码,每次系统需要重绘 View 时,您都会启动新的计时器;随着计时器开始重叠,这可能很快就会失控。
但是,只需稍微重新安排一下,我们就可以完成这项工作。
请注意:这不一定是处理圆形动画的正确方法,但它会解决您提出的特定问题关于无效上下文错误。
从 drawRect
中取出所有内容,并将其替换为对 eraseCircle
和 drawCircle
的调用。
采用必须递增 x
和 y
以及 eraseX
和 eraseY
的逻辑从 drawCircle
和 eraseCircle
中取出,并将其放入 timerDraw
和 timerErase
中。
不要直接在timerDraw
和timerErase
中调用绘图代码,而是通过调用setNeedsDisplay()
告诉 View 系统您需要重绘 View 。 .这会将您的 View 标记为需要重绘,并且 View 系统会尽快自动再次调用您的 drawRect
函数。
通过覆盖 didMoveToSuperview
并在那里启动它们,让您的计时器再次工作;如果它们已经在运行,您还应该添加停止它们的逻辑。
第 1 步和第 3 步是消除错误的关键部分。
像这样:
//Creating a view capable of painting the circle
class CircleView: UIView {
// Timers
var drawTimer: NSTimer?
var eraseTimer: NSTimer?
//Starting X Pos
var x: CGFloat = 100
var eraseX: CGFloat = 100
//Starting Y Pos
var y: CGFloat = 100
var eraseY: CGFloat = 100
override func drawRect(rect: CGRect) {
eraseCircle()
drawCircle()
}
override func didMoveToSuperview() {
// If we have active timers, stop them
if var drawTimer = self.drawTimer {
// This stops the timer
drawTimer.invalidate()
self.drawTimer = nil
}
if var eraseTimer = self.eraseTimer {
// This stops the timer
eraseTimer.invalidate()
self.eraseTimer = nil
}
// If we're actually part of the view hierarchy, start the timers
if self.superview != nil {
//Creating the looping draw timer
self.drawTimer = NSTimer.scheduledTimerWithTimeInterval(
0.2,
target: self,
selector: Selector("timerDraw"),
userInfo: nil,
repeats: true)
//Creating the looping erase timer
self.eraseTimer = NSTimer.scheduledTimerWithTimeInterval(
0.3,
target: self,
selector: Selector("timerErase"),
userInfo: nil,
repeats: true)
}
}
func drawCircle() {
//Setting the draw color
UIColor.blackColor().setFill()
// Creating the rectangle's size
var drawRect = roundDrawRect(10.0, angle: 7)
//Drawing the rectangle
drawRect.fill()
}
func eraseCircle() {
//Setting the eraser color
UIColor(patternImage: UIImage(named: "normalpaper.jpg")).setFill()
// Creating the rectangle's size
var eraseRect = roundEraseRect(10.0, angle: 7)
//Drawing the rectangle
eraseRect.fill()
}
func timerDraw(){
//Incrementing the coords
++y
++x
self.setNeedsDisplay()
}
func timerErase(){
//Decrementing the coords
eraseX = x - 2
eraseY = y - 2
self.setNeedsDisplay()
}
//Defining the rounded rect erasing (Circle)
func roundEraseRect(radius: CGFloat, angle: CGFloat) -> UIBezierPath {
//Creating the rounded rect (Circle)
var roundedRect = UIBezierPath()
roundedRect.moveToPoint(CGPointMake(eraseX,eraseY))
println(CGPointMake(eraseX,eraseY))
roundedRect.addArcWithCenter(CGPointZero, radius: radius,
startAngle: 0, endAngle: angle ,
clockwise: true)
return roundedRect
}
//Defining the rounded rect drawing (Circle)
func roundDrawRect(radius: CGFloat, angle: CGFloat) -> UIBezierPath {
//Creating the rounded rect (Circle)
var roundedRect = UIBezierPath()
roundedRect.moveToPoint(CGPointMake(x,y))
roundedRect.addArcWithCenter(CGPointZero, radius: radius,
startAngle: 0, endAngle: angle ,
clockwise: true)
return roundedRect
}
}
至于实现您正在尝试的动画的最佳方式,您可以考虑只绘制一次圆圈,然后在您的 UIViewController
中在计时器上移动整个 View 。或者,可能更好,使用 Core Animation .或者,如果您的最终产品将是一款游戏(甚至是类似游戏),也许可以看看 Sprite Kit .
关于ios - 省略 UIColor.setFill() 错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25840455/
我试图让我的输出看起来像这样: size time1 time2 ------------------------------- 10 4
我正在尝试在 Java 中传递一个变量,我需要帮助让它工作,我在下面包含了所有相关代码,我正在使用三个 .java 文件。以下是所有设置的方式以及我需要它的工作方式; 属性.java public e
要点如下:我有一个 getColor 方法和一个 setColor 方法。 getColor 将全局指针 color_obj 更新为当前对象。 setColor 使用该指针来更改对象的颜色。 问题是,
我正在尝试创建一个基于多个文件的程序来读取时间,但我无法以所需的格式显示时间。更具体地说,setfill 似乎给我带来了问题。 这是我在编译时收到的一条很长的错误消息的开头: error: no ma
我试图了解 JavaFX Canvas setStroke 方法的工作原理。它不会将像素的颜色设置为所需的值。不过 setFill 方法没有问题。 Canvas canvas = new Canvas
这个问题已经有答案了: Can we call a method at class level rather than in a method? (3 个回答) 已关闭 3 年前。 我正在启动 Jav
我正在编写一款受康威的“生命游戏”启发的游戏。 虽然我已经弄清楚了整体游戏逻辑(但没有编码),但我仍然无法在玩家的第一个回合结束后更改矩形对象的填充颜色。当我运行我的程序时,它会跳过对玩家一号颜色(C
基本上,我正在尝试通过 setfill 和 setw 创建一个固定表来显示存储在数组中的信息,但是设置宽度似乎没有起作用,我不确定为什么。这是我正在使用的代码: const int MAXWIDTH
我有两个并排的函数,它们循环不断地绘制两个 UIBezierPaths,问题是,它们每个都有不同的颜色,所以我经常需要重申 UIColor.blackColor().setFill() 和 UICol
根据我的理解,setw(n) 通过创建一个宽度为 n 个字符的行为。另一方面,setfill('x') 允许我们打印 n 个 x 个字符。 我想得到两排星星,像这样: ****************
所以我已经解决这个问题一段时间了,在成员的帮助下,我快完成了。我的最后一个问题在上面。 如有必要,我需要将 cout 时间格式化为 01:01:01,但是,我的输出是 1:1:1 问题出在这里: st
Win7 - 64 cygwin Netbeans 7.4 gcc (cygwin) 4.8.3 编译器调用 g++ -Wall -Wno-reorder -Wno-unused-value -c -
在 C++ 中: int main() { cout << setfill('#') << setw(10) << 5 << endl; return 0; } 输出: #######
我有一个现有的代码库,它创建了一个舞台,然后添加了一些图层,并在其中一个图层中绘制了 KineticJS 多边形。现在我需要在用户单击舞台外的元素时更新多边形的背景。 我已经设法获取了舞台细节,然后是
我有一些 Java 代码: public static String getSaveFilePath(String title2) { FileDialog fd = new FileDial
一个简单的 C++ 乘法表。 int main() { int i, j; i = j = 1; for (i; i < 10; i++) { for (j = 1
我不明白为什么这段代码在 drawRect: 中有效: UIBezierPath *buildingFloor = [[UIBezierPath alloc] init]; // draw the s
我很好奇 std::setw 和 std::setfill 的真正返回类型 正如我们所见,它们返回值的数据类型是“未定义”。但是,是否可以声明一个没有返回类型的函数? 在我必须开发一种方法为“cout
所以我知道有很多次我想重置我使用 iomanip 所做的格式更改。我创建了一个类,您可以使用它来获取 ostream 对象的格式,例如用于写入/读取文件的 std::cout 或 fstream 对象
我正在尝试使用 setw 和 setfill 获得以下输出: OPTIONS: The usual operators +, -, *, / and % (remainder)
我是一名优秀的程序员,十分优秀!