1

UIImagePickerController から画像を読み込み、UIScrollview に読み込むアプリに取り組んでいます。ScrollView への画像の読み込みは正常に機能します。ただし、画像はさまざまな縮尺で読み込まれます (コードは下部にあり、画像はデモンストレーション用です)。アプリケーションによって読み込まれた最初の画像は正常に読み込まれますが、2 番目の画像は縮小されすぎます。どちらも同じコード ブロックを介して読み込まれます。

UIImagePickerController によるイメージの最初の読み込み:

フルサイズの画像

同じ画像の 2 回目の読み込み:

画像は読み込まれましたが、ビューがいっぱいになりません

これは loadImage メソッドで、どちらもロードされます。

-(void)loadImage:(UIImage *)image
{
        imageView.image = image;
    [imageScrollView setFrame: CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height)];
    [imageScrollView setDelegate:self];

    [imageScrollView setShowsHorizontalScrollIndicator:NO];
    [imageScrollView setShowsVerticalScrollIndicator:NO];
    [imageScrollView setMaximumZoomScale:2.0];


    CGRect rect;
    rect.size.width = imageView.image.size.width;
    rect.size.height = imageView.image.size.height;
    [imageView setFrame:rect];

    [imageScrollView setContentSize:[imageView frame].size];

    float minimumScale = [imageScrollView frame].size.width  / [imageView frame].size.width;
    [imageScrollView setMinimumZoomScale:minimumScale];
    [imageScrollView setZoomScale:minimumScale];

}

単純な問題であるべき問題に対する 4 ~ 5 時間の遊びと答えの検索にもかかわらず、私は困惑しています。私自身の努力では何も変わりませんし、この問題について誰かが助けを求めている例も見つけていません。画像が常に最初に正しく表示されるようにするには、コードで何を変更する必要がありますか?

どんな助けでも大歓迎です!

4

1 に答える 1

1

単に必要だと思います[self.imageScrollView setZoomScale:1.0f];が、複合的な問題が発生する可能性があります。

すでにデバッグに時間を費やしているので、問題を特定するのに役立つヒントをいくつか紹介しましょう。私の最初の推奨事項は、基本に戻ることです。

1 - ビューが適切に構築されていることを確認してください。自動レイアウトが有効になっている場合。おそらくオフにして、物事を非常にシンプルに保ちます。その中に UIScrollView と UIImageView が必要です。

2 - 小さなステップを続けて、各ビューの背景色を不快な色に設定します。ビュー = 赤; scrollview = 緑; 画像ビュー = 青。スクロールビューのサイズを変更して、ビューよりも小さくします。スクロールビューよりも小さくなるようにイメージビューのサイズを変更します。イメージビューで「サブビューをクリップ」オプションを設定します。

3 - viewDidLoad メソッドでより永続的なプロパティを設定します。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.scrollView setDelegate:self];
    [self.scrollView setMinimumZoomScale:0.5f];
    [self.scrollView setMaximumZoomScale:2.5f];
    [self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}

4 - imageView を画像に設定する行を除いて、すべての loadImage コードをコメントアウトします。imageView のコンテンツ モード設定によってビューの動作がどのように変化するかを試してください。self.imageView.contentMode = UIViewContentModeScaleAspectFit;比率を変更せずに、imageView 内に収まるように画像のサイズを変更するように設定した場合に注意してください。ただし、モードを topLeft に設定すると、ビューのサイズが画像のサイズに変更されます。

また、スクロールビューがどのように機能するかを検討してください。スクロールビューのフレームを、インターフェースビルダーで作成したサイズと同じサイズのままにしたい。表示する必要がある「コンテンツ」がスクロールビューのフレームよりも大きい場合、スクロールビューはスクロールします。スクロールビューのコンテンツの高さを大きく設定するだけで、小さな画像をスクロールビュー内でスクロールできます。imageView フレームのサイズを変更してスクロールビューのフレームよりも大きくすると、おそらく、スクロールビューのコンテンツ領域も調整したいと思うでしょう。しかし、あなたの説明からすると、それはあなたがやっていることではないと思います。

5 - 画像を取得したら、画像ビューに貼り付けます。前の画像をズームする場合は、zoomScale = 1.0 を設定します。スクロールしている場合に備えて、コンテンツ オフセットを 0,0 に設定します...

- (void)imagePickerController:(UIImagePickerController *) picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    NSLog(@"Picked: %@", info);
    [self dismissModalViewControllerAnimated:YES];
    UIImage * image = [info objectForKey:UIImagePickerControllerOriginalImage];
    [self.imageView setImage:image];
    // You want to resize the image to fit inside our view, not fit view to image, right?
    //[self.imageView setFrame:CGRectMake(0, 0, image.size.width, image.size.height)];
    //[self.scrollView setContentSize:image.size];
    [self.scrollView setZoomScale:1.0f];
    [self.scrollView setContentOffset:CGPointZero];
}

あなたが説明したことに基づいて、上記はあなたのために働くはずです。詳細が多すぎて申し訳ありませんが、物事を視覚化するためのヒント/テクニックをいくつか追加すると役立つかもしれないと思いました.

更新 明確にする必要があります...コードは機能しますが、ビューのサイズはscrollViewによってスケーリングされています。それはあなたの計算を捨てます。loadImage の上部で zoomScale=1.0 を設定すると、残りは意図したとおりに機能するはずです。とはいえ、目的の動作に応じて、もう少し洗練することができます。

--d

于 2012-10-27T17:45:46.660 に答える