2

私はこれを数日間続けており、いくつかのことを試しましたが、まだ行き詰まっています. 何が問題なのか、それに対する可能な解決策を理解できることを願っていますが、これは現時点で私を夢中にさせています。助けてくれた人に前もって感謝します。

コンテキスト: 私は黒板のデモ (つまり、まだアプリではなく、単なる概念実証) に取り組んでいます。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 で定義されたアウトレットにリンクしようとしましたが、残念ながら問題は変わりませんでした。

4

2 に答える 2

0

touchesMoved: メソッドでは、タッチが黒板または別のビューを含む UIImageView にあるかどうかを検出する条件を設定できます。黒板ビューでない場合は、画像を描画せずに返します。

于 2012-04-16T10:22:21.703 に答える
-1

私は最終的に、Apple のドキュメントで提案されている方法でこの問題に取り組みました。横向きのView Controllerを作成し、縦向きをこれに移動させました。かなりうまく機能します。

于 2012-04-20T13:06:37.923 に答える