- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 CgLayer 上使用 unod 重做操作,我已经尝试了一些代码,但无法让它工作,不知道,我哪里错了,下面是我写的代码
这是我的 drawRect 函数
- (void)drawRect:(CGRect)rect
{
m_backgroundImage = [UIImage imageNamed:@"bridge.jpg"];
CGPoint drawingTargetPoint = CGPointMake(0,0);
[m_backgroundImage drawAtPoint:drawingTargetPoint];
switch(drawStep)
{
case DRAW:
{
CGContextRef context = UIGraphicsGetCurrentContext();
if(myLayerRef == nil)
{
myLayerRef = CGLayerCreateWithContext(context, self.bounds.size, NULL);
}
CGContextDrawLayerAtPoint(context, CGPointZero, myLayerRef);
break;
}
case UNDO:
{
[curImage drawInRect:self.bounds];
break;
}
default:
break;
}
}
在触摸结束时,我将层转换为 NSValue 并将作为键值对存储到 NSDictionary 中,然后将字典对象添加到数组中。
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSValue *layerCopy = [NSValue valueWithPointer:myLayerRef];
NSDictionary *lineInfo = [NSDictionary dictionaryWithObjectsAndKeys:layerCopy, @"IMAGE",
nil];
[m_pathArray addObject:lineInfo];
NSLog(@"%i",[m_pathArray count]);
}
下面是我的撤消功能
- (void)undoButtonClicked
{
if([m_pathArray count]>0)
{
NSMutableArray *_line=[m_pathArray lastObject];
[m_bufferArray addObject:[_line copy]];
[m_pathArray removeLastObject];
drawStep = UNDO;
[self redrawLine];
}
}
//Redraw functions
- (void)redrawLine
{
NSDictionary *lineInfo = [m_pathArray lastObject];
NSValue *val = [lineInfo valueForKey:@"IMAGE"];
CGLayerRef layerToShow = (CGLayerRef) [val pointerValue];
CGContextRef context1 = CGLayerGetContext(layerToShow);
CGContextDrawLayerAtPoint(context1, CGPointMake(00, 00),layerToShow);
[self setNeedsDisplayInRect:self.bounds];
}
我认为这是我出错的地方。所以 friend 们请帮帮我。
从下面的评论中,我添加了函数,它绘制到 Cglayer 中(这个函数我正在调用 touchesMovedEvent。
- (void) drawingOperations
{
CGContextRef context1 = CGLayerGetContext(myLayerRef);
CGPoint mid1 = midPoint(m_previousPoint1, m_previousPoint2);
CGPoint mid2 = midPoint(m_currentPoint, m_previousPoint1);
CGContextMoveToPoint(context1, mid1.x, mid1.y);
CGContextAddQuadCurveToPoint(context1, m_previousPoint1.x, m_previousPoint1.y, mid2.x, mid2.y);
CGContextSetLineCap(context1, kCGLineCapRound);
CGContextSetLineWidth(context1, self.lineWidth);
CGContextSetStrokeColorWithColor(context1, self.lineColor.CGColor);
CGContextSetAllowsAntialiasing(context1, YES);
CGContextSetInterpolationQuality(context1, kCGInterpolationHigh);
CGContextSetAlpha(context1, self.lineAlpha);
CGContextStrokePath(context1);
}
问候兰 git
最佳答案
实现 Undo 和 Redo 的最好方法是实现 NSUndoManager
作为对它的简要描述你不必保存你想要撤销或重做的对象的每个状态 NSUndoManager 本身使这个给你...
达到这个目的的步骤是:
1- 初始化 NSUndoManager。
2- 使用指定的函数调用在 NSUndoManager 对象中注册对象状态,稍后将针对您的情况进行讨论。
3-在 NSUndoManager 对象中使用撤消或重做或清除操作功能。
Ex 来 self 的工作解决方案
-在.h文件中
@property (nonatomic,retain) NSUndoManager *undoManager;
在.m文件中
@synthesize undoManager;
在“viewDidLoad”方法中——初始化您的 NSUndoManager
undoManager = [[NSUndoManager alloc] init];
假设您在类里面有一个使用捏合来放大/缩小的函数,那么在您的“viewDidLoad”中您将拥有
UIPinchGestureRecognizer *pinchGesture =
[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
pinchGesture.delegate = (id)self;
[self.view addGestureRecognizer:pinchGesture];
所以捏会放大/缩小这样请注意,“MyImageView”是我们要放大/缩小的图像
- (void)pinch:(UIPinchGestureRecognizer*)recognizer{
if (recognizer.state == UIGestureRecognizerStateEnded || recognizer.state == UIGestureRecognizerStateChanged) {
NSLog(@"gesture.scale = %f", recognizer.scale);
CGFloat currentScale = self.MyImageView.frame.size.width / self.MyImageView.bounds.size.width;
CGFloat newScale = currentScale * recognizer.scale;
//Here is the line that register image to NSUndoManager before making and adjustments to the image "save current image before changing the transformation"
//Add image function is function that fired when you Make undo action using NSUndoManager "and so we maintain only image transformation that changed when you zoom in/out"
[[undoManager prepareWithInvocationTarget:self] AddImage:self.MyImageView.transform];
if (newScale < 0.5) {
newScale = 0.5;
}
if (newScale > 5) {
newScale = 5;
}
CGAffineTransform transform = CGAffineTransformMakeScale(newScale, newScale);
self.MyImageView.transform = transform;
recognizer.scale = 1;
}
}
-AddImage 函数将当前图像转换状态保存在 NSUndoManager 中。
-(void)AddImage:(CGAffineTransform)sender{
CGAffineTransform transform = sender;
self.MyImageView.transform = transform;
}
所以如果你有一个按钮可以撤销操作
-(IBAction)OptionsBtn:(id)sender{
if ([undoManager canUndo]) {
[undoManager undo];
}
}
所以如果你想取消所有的操作你有两种方式
while ([undoManager canUndo]) {
[undoManager undo];
}
或
[undoManager removeAllActions];
关于ios - 使用 CGLayer 撤消重做问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11394839/
我正在尝试使用谷歌浏览器的 Trace Event Profiling Tool分析我正在运行的 Node.js 应用程序。选择点样本后,我可以在三种 View 之间进行选择: 自上而下(树) 自上而
对于一个可能是菜鸟的问题,我们深表歉意,但尽管在 SO 上研究了大量教程和其他问题,但仍找不到答案。 我想做的很简单:显示一个包含大量数据库存储字符串的 Android ListView。我所说的“很
我已经开始了一个新元素的工作,并决定给 Foundation 5 一个 bash,看看它是什么样的。在创建带有水平字段的表单时,我在文档中注意到的第一件事是它们使用大量 div 来设置样式。所以我在下
我有一个 Windows 窗体用户控件,其中包含一个使用 BeginInvoke 委托(delegate)调用从单独线程更新的第 3 方图像显示控件。 在繁重的 CPU 负载下,UI 会锁定。当我附加
我有一堆严重依赖dom元素的JS代码。我目前使用的测试解决方案依赖于 Selenium ,但 AFAIK 无法正确评估 js 错误(addScript 错误不会导致您的测试失败,而 getEval 会
我正在制作一款基于滚动 2D map /图 block 的游戏。每个图 block (存储为图 block [21][11] - 每个 map 总共 231 个图 block )最多可以包含 21 个
考虑到以下情况,我是前端初学者: 某个 HTML 页面应该包含一个沉重的图像(例如 - 动画 gif),但我不想强制客户缓慢地等待它完全下载才能享受一个漂亮的页面,而是我更愿意给他看一个轻量级图像(例
我正在设计一个小软件,其中包括: 在互联网上获取资源, 一些用户交互(资源的快速编辑), 一些处理。 我想使用许多资源(它们都列在列表中)来这样做。每个都独立于其他。由于编辑部分很累,我想让用户(可能
我想比较两个理论场景。为了问题的目的,我简化了案例。但基本上它是您典型的生产者消费者场景。 (我关注的是消费者)。 我有一个很大的Queue dataQueue我必须将其传输给多个客户端。 那么让我们
我有一个二元分类问题,标签 0 和 1(少数)存在巨大不平衡。由于测试集带有标签 1 的行太少,因此我将训练测试设置为至少 70-30 或 60-40,因此仍然有重要的观察结果。由于我没有过多地衡量准
我是一名优秀的程序员,十分优秀!