8235
現在画面中央に表示されている画像をピンチインで拡大させ、その状態で画像を端から端までスクロールして見れるようなプログラムを作っているのですが、なぜか画像をピンチインで拡大した後に縦スクロールができません。横スクロールはできます。また、ピンチイン後に少し画像が下にズレます。何かそれが縦スクロールできないことに関係している気もするのですが......。下記にコードを記します。どなたか分かる方がいれば教えていただきたいです。すみませんが、よろしくお願いします。

ImageScaleViewController.h

```

    @interface ImageScaleViewController : UIViewController
    
    @property (weak, nonatomic) UIImageView *scaleImageView;
    @property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
    
    @end
    
```

ImageScaleViewController.m

```

    UIImageView *scaleImageView;
    
    @implementation ImageScaleViewController
    
    - (void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:YES];
    
        self.view.backgroundColor = [UIColor blackColor];
    
        scaleImageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.scaleImageView.center.x - self.scaleImageView.bounds.size.width / 2, self.scaleImageView.center.y - self.scaleImageView.bounds.size.height / 2, self.scaleImageView.bounds.size.width, self.scaleImageView.bounds.size.height)];
        scaleImageView.image = self.scaleImageView.image;
    
        [self.scrollView addSubview:scaleImageView];
    
        [self imageScaleByAffine];
    
        [self setPinchGesture];
    }
    
    - (void)imageScaleByAffine {
        [UIView animateWithDuration:0.2f animations:^{
            scaleImageView.frame = CGRectMake(0, 0, scaleImageView.frame.size.width * 2, scaleImageView.frame.size.height * 2);
            scaleImageView.center = self.view.center;
        }];
    }
    
    - (void)setPinchGesture {
        self.scrollView.minimumZoomScale = 2.0;
        self.scrollView.maximumZoomScale = 3.0;
    }
    
    - (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView {
        return scaleImageView;
    }
    
    @end
    
```
CC BY-SA 3.0
2015-03-21T14:59:15.427
8221
2015-03-22T13:04:52.083
2015-03-22T08:11:34.950
5210
5210
question
objective-c uiscrollview
ピンチイン後に画像を縦スクロールできない
ImageScaleViewController.h

```

    #import <UIKit/UIKit.h>
    // ここから引用しよう。
    @interface ImageScaleViewController : UIViewController <UIScrollViewDelegate>
    // UIScrollViewDelegateを組みこまないと、DelegateメソッドviewForZoomingInScrollView:が動かないのでは？
    
    @property (weak, nonatomic) IBOutlet UIImageView *scaleImageView;
    // なぜ、これにIBOutletが付いてない？
    @property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
    
    @end
    
```

ImageScaleViewController.m

```

    #import "ImageScaleViewController.h"
    
    @implementation ImageScaleViewController {
        UIImageView *scaleImageView;
        // インスタンス変数は、ここに記述する。元コードの位置のままだと、それはC言語のグローバル変数。
    }
    
    - (void)viewDidAppear:(BOOL)animated {
        // [super viewDidAppear:YES];
        [super viewDidAppear: animated];
        // 特別な意図がない限り、スーパークラスには、引数に手を加えず、そのまま渡す。
    
        self.view.backgroundColor = [UIColor blackColor];
    
        scaleImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.scaleImageView.bounds.size.width, self.scaleImageView.bounds.size.height)];
        // scaleImageViewの左上の座標を{0, 0}以外にしても、意味ありません。詳しい説明はあとで。
        scaleImageView.image = self.scaleImageView.image;
        self.scrollView.contentSize = scaleImageView.bounds.size;
        // この1行挿入で、問題は解決しているはず。
        [self.scrollView addSubview:scaleImageView];
    
        [self imageScaleByAffine];
    
        [self setPinchGesture];
    }
    
    - (void)imageScaleByAffine {
        [UIView animateWithDuration:0.2f animations:^{
            self.scrollView.contentOffset = CGPointMake((scaleImageView.bounds.size.width - self.scrollView.bounds.size.width) / 2.0, (scaleImageView.bounds.size.height - self.scrollView.bounds.size.height) / 2.0);
            // scrollView中央に、scaleImageViewを位置させる。scaleImageViewの位置（center）をいじっても意味ありません。スクロールビュー内のコンテンツの位置は、UIScrollViewのプロパティcontentOffsetで調節します。
        }];
    }
    
    - (void)setPinchGesture {
        self.scrollView.minimumZoomScale = 2.0;
        self.scrollView.maximumZoomScale = 3.0;
        // どちらかの値を1.0にすべきだと思う。あるいは、最小値が1.0より小さく、最大値が1.0より大きくする。そうしないと、最初ピンチしたときのふるまいが、ユーザに奇妙な印象を与える。
    }
    
    - (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView {
        return scaleImageView;
    }
    
    @end
    
```

解説は、すべてコメントで記述したので、ここに書き記すことはありません。
CC BY-SA 3.0
2015-03-22T11:51:33.923
8235
2015-03-22T13:04:52.083
2015-03-22T13:04:52.083
7362
7362
8221
answer