私は数日間はこれをやってきましたが、まだいくつかのことを試していましたが、まだそれに固執していました。私は何が間違っているのか、それに対する解決策を理解することができます。これは私が現時点で狂っているようなものです。私は事前に助けてくれた誰かに感謝します。フィンガードローがランドスケープモードで動作しない
コンテキスト::私はデモ(まだそのアプリケーションではないという意味で、概念の証明)を黒板に取り組んでいます。 StackOverflowでは、「スパム防止」の理由で画像に質問を投稿できないため、写真を表示するためにDropboxアカウントをリンクしようとしています。あなたは、画像1
にポートレートモードで問題を黒板を見ることができ
https://www.dropbox.com/gallery/5189052/1/so?h=8573b1
:私は実際には二つの問題があり、これを参照してください。
最初は、ポートレートモードで図面がうまくいくようですが、 をランドスケープモードに切り替えると、描画領域に異なるサイズが反映されていないように見えます。
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で定義されたコンセントにリンクしようとしましたが、残念ながらそれは問題のいずれも変更しませんでした。
あなたの答えをありがとう。タッチがどのようなビューになっているかをチェックする方法や、チェックする必要があるのかどうかは完全にはわかりません。私のコードではself.viewにrectを描画しますが、私はそれがタッチの表示であると思いますか? もう一度ありがとうございます。 – Diferdin
あなたはdrawImageフレームをself.viewに設定してから描画します。私の提案は、drawImageのy + 100の値でフレームを開始し、黒板だけを描画します。残ったダスターや色の選択は可能ですdrawImageの上にあるself.viewのボタンとして、タッチがどこで起きているのかを簡単に識別できます。 – user1226038
もう一度ありがとう。私は少し混乱しています... 私はあなたの提案から私が理解していると思ったことを試しました。私は設定します drawImage.frame = CGRectMake(100,100,320,480); となり、その結果、線Iの結果はそれらの座標の容量でシフトされます。私はそれがDrawImageで実際に描画されていることを意味すると思いますか? 乾杯。 – Diferdin