私はこれを数日間続けており、いくつかのことを試しましたが、まだ行き詰まっています. 何が問題なのか、それに対する可能な解決策を理解できることを願っていますが、これは現時点で私を夢中にさせています。助けてくれた人に前もって感謝します。
コンテキスト: 私は黒板のデモ (つまり、まだアプリではなく、単なる概念実証) に取り組んでいます。StackOverflow では、「スパム防止」の理由から質問に画像を投稿できないため、Dropbox アカウントをリンクして写真を表示しようとしています。これを見てください:
https://www.dropbox.com/gallery/5189052/1/so?h=8573b1
画像 1 のポートレート モードで黒板を見ることができます。
問題: 実際には 2 つの問題があります。
1 つ目は、縦向きモードでは描画がうまく機能しているように見えますが、横向きモードに切り替えると、描画領域が異なるサイズを反映していないようです。
2 つ目は、黒板を含む 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 で定義されたアウトレットにリンクしようとしましたが、残念ながら問題は変わりませんでした。