2

我已经坚持了几天了,尝试了几件事,但仍然坚持下去。希望我能理解问题所在以及可能的解决方案,这让我现在有点抓狂。我提前感谢任何提供帮助的人。

上下文:我正在为黑板做一个演示(这意味着还不是一个应用程序,只是一个概念证明)。由于“防止垃圾邮件”的原因,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 上定义的插座,但不幸的是,这并没有改变任何问题。

4

2 回答 2

0

在 touchesMoved: 方法中,您可以设置一个条件来检测触摸是否在包含黑板的 UIImageView 或其不同的视图上。如果它不是黑板视图,则返回它而不绘制图像。

于 2012-04-16T10:22:21.703 回答
-1

我终于按照 Apple 文档中建议的方式解决了这个问题;我创建了一个横向视图控制器,并让肖像传输到此。效果很好。

于 2012-04-20T13:06:37.923 回答