web-dev-qa-db-ja.com

iOS-UIScrollViewが機能していません(まったくスクロールしません-画像は固定されたままです)

画像ビューに画像(幅:320ピクセル、高さ:1250ピクセル)を表示したい。

アプリケーションをコンパイルすると、まったくスクロールしません。ビューは固定されたままです。

私がしたこと:

  1. Interface Builder を介してUIScrollViewをビューに追加しました。
  2. Interface Builder経由でUIImageViewをビューに追加しました。
  3. Interface BuilderでUIImageViewUIScrollViewの下にあることを確認しました。
  4. UIScrollViewのサイズをViewDidLoadで設定します。

どうすればいいですか?

コード:

- (void)viewDidLoad
{
    [super viewDidLoad];
    scrollView.contentSize = CGSizeMake(320, 1250);
}

スクリーンショット:

ImageView

Enter image description here

ScrollView

Enter image description hereEnter image description here

Enter image description here

23
user1010563

私はちょうど同じタスクを実行しました..これを試してください.....

scrollView.delegate = self;
scrollView.scrollEnabled = YES;

int scrollWidth = 120;
scrollView.contentSize = CGSizeMake(scrollWidth,80);     


int xOffset = 0;
imageView.image = [UIImage imageNamed:[imagesName objectAtIndex:0]];

for(int index=0; index < [imagesName count]; index++)
{       
    UIImageView *img = [[UIImageView alloc] init];
    img.bounds = CGRectMake(10, 10, 50, 50);
    img.frame = CGRectMake(5+xOffset, 0, 50, 50);
    NSLog(@"image: %@",[imagesName objectAtIndex:index]);
    img.image = [UIImage imageNamed:[imagesName objectAtIndex:index]];
    [images insertObject:img atIndex:index];         
    scrollView.contentSize = CGSizeMake(scrollWidth+xOffset,110); 
    [scrollView addSubview:[images objectAtIndex:index]];

    xOffset += 70;
}

これも設定してください。

imagesName = [[NSArray alloc]initWithObjects:@"image1.jpg",@"image2.jpg",@"image3.jpg",@"image4.jpg",@"image5.jpg",@"image6.png",@"image7.png",@"image9.png",nil];
    images = [[NSMutableArray alloc]init];
27
Krunal

私にとって問題は、viewDidLoad()でコンテンツサイズの設定が機能しないことでした。私はすべてを試しましたが、なぜ動作しないのか理解できませんでした。viewDidAppear()で同じことを試したところ、魔法のように動作しました...

26
gitaarik

あなたの最後のスクリーンショットとあなたのコメントから、scrollViewは大きくなっているように見えます。 scrollviewは、画面上に完全に表示される必要があります。たとえば、iPhoneのフルスクリーンUIScrollViewのサイズは320 x 460です。

スクロールビューがコンテンツと同じサイズの場合、スクロールできません。

緑がかった長方形はスクロールビューのサイズを示し、ピンクがかったコンテンツ(画像)のサイズを示します。

enter image description here

10
Matthias Bauch

同様の問題があることがわかりましたが、上記のコードはどれも動作しませんでした。この問題は自動レイアウトによるものでした。 [ユーティリティ]-> [ファイルインスペクター]をクリックしてストーリーボードに移動して自動レイアウトをオフにし、Use Autolayoutスクロールは機能しました(私もscroll.contentSize = ...)。

6
Julius

Xcode 5以降、以前のようには機能しません。また、スクロール可能なテキストフィールドの最後までスクロールすると問題が発生します。 iPhoneまたはiPadで実行する場合にも違いがあります。 iPhoneでは、遅延タイマーなしで機能しました。

これは私のために働いた:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSTimer *timerforScrollView;
    timerforScrollView =[NSTimer scheduledTimerWithTimeInterval:0.1
           target:self selector:@selector(forScrollView)userInfo:nil repeats:NO];   
}

- (void) forScrollView {
    [scrollviewPad setScrollEnabled:YES];
    [scrollviewPad setContentSize:CGSizeMake(768, 1015)]; // must be greater then the size in Storyboard
}
6
Walter Schurter

IOS6でこの同じ問題に遭遇しましたが、解決策はContentSizeをプログラムで調整することでした。したがって、これを示すためにラジャ(上記)から引用します。

CGSize scrollViewContentSize = CGSizeMake(320, 400);
[self.scrollView setContentSize:scrollViewContentSize];

注:iOS5ではこの問題はありませんでした..iOS6は、回転/方向のサガのようにいたずらをたくさんすることにしたようです

6
Khayrattee

Swift 4、iOS 11

自動レイアウトを使用する最も簡単な方法:

  1. UIScrollViewを追加し、スーパービュー(または希望のサイズ)に0,0,0,0を固定します
  2. ScrollViewにUIViewを追加し、4つすべての側面に0,0,0,0を固定し、水平および垂直に中央揃えします。
  3. サイズインスペクターで、「bottom」および「align center Y」の優先順位を250に変更します。
  4. 必要なすべてのビューをこのビューに追加します。 忘れないでください最下部のビューに下部の制約を設定します。
4

追加することを忘れないでください カテゴリー このようなインターフェースへのプロトコル

@interface MyViewController : <UIScrollViewDelegate>

そうしないと、スクロールビューのデリゲートをselfに設定できません。

(つまり、[MyScrollView setDelegate:self];

これを行うと、動作するはずです。

私のコードは:

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [contentScrollView setDelegate:self];
    [contentScrollView setScrollEnabled:YES];
    contentScrollView.contentSize = CGSizeMake(310, 500);
    contentScrollView.frame = CGRectMake(5, 188, 310, 193);
}
3
werdsackjon

XibでautoLayoutチェックボックスがチェックされている場合があります。また、xcode 5でこの問題が発生します。これにより、UIScrollViewがスクロールオフになります。

3
Vinay Kumar

スクロールのビューデリゲートを割り当てましたか?これらを常に覚えておいてください:

[self.scrollView setDelegate:self]; 
[self.scrollView setScrollEnabled:YES];
2
Alex Salom

画像ビューは、スクロールビューのサブビュー(つまり、内側と下)でなければなりません。あなたの説明から、彼らは平行であるようです

1
Tomen

1行忘れました。これをビューロード関数に追加します。

[scrollView setScrollEnabled:YES];
1
Sirens

AutoLayoutを無効にしてみてください。 XCode 5では、上記のすべての回答をテストしましたが、自動レイアウトを無効にし、サイズインスペクターですべての自動サイズ変更マスクをアクティブにすることによってのみスクロールできました。次のコードも使用されました。

self.scrollView.contentSize = CGSizeMake(320, 900);
self.scrollView.delegate = self;
self.scrollView.scrollEnabled = YES;
self.scrollView.frame = self.view.frame;
1
jturolla

コードを追加するだけ

scrollView.contentSize = CGSizeMake(WIDTH,HEIGHT);

メソッドへ-(void)viewDidLayoutSubviews。詳細については、View Controllerのライフサイクルを理解するためのStanford CS193p Lecture No 8をご覧ください。

0
iOS_Dev

私は同じ問題を抱えていて、このスレッドで答えを探していました。私はすべてを試しましたが、何も機能しません。それから私はこれを見つけました:

deselect Use Auto Layout

ViewControllerのファイルインスペクタで"Use Auto Layout"を選択解除するだけです。タダ、それは私のためにすぐに動作します。楽しい。

0
Watsche
CGRect scrollViewFrame = CGRectMake(0, 0, 320, 400);
self.scrollView = [[UIScrollView alloc] initWithFrame:scrollViewFrame];

[self.view addSubview:self.scrollView];
CGSize scrollViewContentSize = CGSizeMake(320, 400);
[self.scrollView setContentSize:scrollViewContentSize];
scrollView.delegate = self;

[self.scrollView setBackgroundColor:[UIColor blackColor]];
[scrollView setCanCancelContentTouches:NO];

scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
scrollView.clipsToBounds = YES;
scrollView.scrollEnabled = YES;
scrollView.pagingEnabled = YES;

NSUInteger nimages = 0;
CGFloat cx = 0;
for (; ; nimages++) {
    NSString *imageName = [NSString stringWithFormat:@"image%d.jpg", (nimages + 1)];
    UIImage *image = [UIImage imageNamed:imageName];
    if (image == nil) {
        break;
    }
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

    CGRect rect = imageView.frame;
    rect.size.height = image.size.height;
    rect.size.width = image.size.width;
    rect.Origin.x = ((scrollView.frame.size.width - image.size.width) / 2) + cx;
    rect.Origin.y = ((scrollView.frame.size.height - image.size.height) / 2);

    imageView.frame = rect;

    [scrollView addSubview:imageView];
    [imageView release];

    cx += scrollView.frame.size.width;
}


[scrollView setContentSize:CGSizeMake(cx, [scrollView bounds].size.height)];
0
codercat

ScrollViewがビューのサブビューであり、それを完全に埋めると仮定すると、viewDidLoadで次を使用できます。

  [scrollView setContentSize: CGSizeMake(self.view.frame.size.width, self.view.frame.size.height)];

スクロールしていないUIScrollViewがあったため、スクロールできました。

0
cdavidyoung