我已经在这几天了,尝试了几件事,但仍坚持下去。希望我能理解错误和可能的解决方案,这让我现在变得疯狂。我提前感谢任何人的帮助。
上下文:我正在为黑板制作一个演示(其含义还不是应用,只是一个概念证明)。由于“防止垃圾邮件”的原因,StackOverflow不允许我在问题中发布图片,所以我试图链接我的Dropbox帐户以显示图片。请看这个:
https://www.dropbox.com/gallery/5189052/1/so?h=8573b1
您可以在图像1中以纵向模式查看黑板。
问题:我实际上有两个问题。
首先,绘图似乎在纵向模式下运行良好,但是当我切换时 到横向模式,绘图区域似乎没有反映出不同的大小。
第二个是我似乎无法强制绘制区域的边界,尽管包含黑板的UIImageView具有正确的(即与其上方的条不重叠)大小。这在纵向和横向模式下都会发生。
您可以在上一个链接的图片2中看到这两个问题;平局停止在纵向模式下停止的位置,它也会在颜色和橡胶条上绘制。
代码:下面是处理触摸的选择器的代码。我还在上面链接的图像3中附上了关于我的nib文件结构的镜头。
//viewDidLoad in MyViewController.m. DrawImage is the UIImageView containing the board
- (void)viewDidLoad {
[super viewDidLoad];
drawImage = [[UIImageView alloc] initWithImage:nil];
drawImage.frame = self.view.frame;
[self.view addSubview:drawImage];
mouseMoved = 0;
colorCode = 1;
red = 1.0;
green = 1.0;
blue = 1.0;
}
//touchesBegan in MyViewController.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
mouseSwiped = NO;
UITouch *touch = [touches anyObject];
if([touch tapCount] == 2) {
drawImage.image = nil;
return;
}
lastPoint = [touch locationInView:self.view];
}
//touchesMoved in MyViewController.m
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
mouseSwiped = YES;
UITouch *touch = [touches anyObject];
CGPoint currentPoint = [touch locationInView:self.view];
UIGraphicsBeginImageContext(self.view.frame.size);
[drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 4.0);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
CGContextStrokePath(UIGraphicsGetCurrentContext());
drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
lastPoint = currentPoint;
mouseMoved++;
if (mouseMoved == 10) {
mouseMoved = 0;
}
}
//touchesEnded in MyViewController.m
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
if ([touch tapCount] == 2) {
drawImage.image = nil;
return;
}
if(!mouseSwiped) {
UIGraphicsBeginImageContext(self.view.frame.size);
[drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0);
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextStrokePath(UIGraphicsGetCurrentContext());
CGContextFlush(UIGraphicsGetCurrentContext());
drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
}
我尝试了什么:在发帖之前,我尝试过一些事情。我注意到在横向模式下,坐标变化是边界而不是框架。例如,self.view.frame.width和height分别在纵向和横向上保持320和480,在横向时边界变为480和320。因此,我试图建立我的路径并依赖边界,但不幸的是我开始(显然)有奇怪坐标的奇怪绘图。
我已经得到了费用,因为我无法在绘图上强制执行正确的界限,因为绘图区域是在主视图的框架上确定的,该框架在整个窗口上延伸。我试图在另一个视图(正确的大小)中插入包含该板的UIImageView,并将其链接到MyViewController.h上定义的插座,但不幸的是,这并没有改变任何问题。
答案 0 :(得分:0)
在touchesMoved:方法中,您可以设置一个条件来检测触摸是否在包含黑板或其不同视图的UIImageView上。如果不是黑板视图则返回它而不绘制图像。
答案 1 :(得分:-1)
我终于以Apple文档中建议的方式解决了这个问题;我创建了一个风景视图控制器,让肖像转移到此。 效果很好。