web-dev-qa-db-de.com

iOS - UIScrollView funktioniert nicht (es scrollt überhaupt nicht - das Bild bleibt fest)

Ich möchte ein Bild (Breite: 320 Pixel, Höhe: 1250 Pixel) in einer Bildansicht anzeigen.

Beim Kompilieren der Anwendung wird überhaupt kein Bildlauf ausgeführt. Die Ansicht bleibt unverändert.

Was ich getan habe:

  1. Meiner Ansicht nach wurde ein UIScrollView über Interface Builder hinzugefügt.
  2. Meiner Ansicht wurde ein UIImageView über den Interface Builder hinzugefügt.
  3. Verifiziert, dass UIImageView im Interface Builder unter UIScrollView liegt.
  4. Stellen Sie die Größe des UIScrollView mit ViewDidLoad ein.

Wie mache ich das?

Code:

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

Screenshots:

ImageView:

Enter image description here

ScrollView:

Enter image description hereEnter image description here

Enter image description here

23
user1010563

Ich habe gerade die gleiche Aufgabe erledigt. Versuchen Sie dieses .....

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;
}

Stellen Sie auch dieses ein ....

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

Für mich bestand das Problem darin, dass die Einstellung der Inhaltsgröße in viewDidLoad() nicht funktioniert hat. Ich habe alles ausprobiert und nicht verstanden, warum es nicht funktionieren soll, und dann habe ich das gleiche in viewDidAppear() ausprobiert und es hat auf magische Weise funktioniert ...

26
gitaarik

Aus deinem letzten Screenshot und deinen Kommentaren geht hervor, dass deine scrollView viel zu groß ist. Die Scrollansicht muss vollständig auf dem Bildschirm sichtbar sein. Ein Vollbild-UIScrollView auf dem iPhone hätte beispielsweise eine Größe von 320 x 460.

Wenn die Bildlaufansicht dieselbe Größe wie der Inhalt hat, können Sie keinen Bildlauf durchführen.

Das grünliche Rechteck zeigt die Größe Ihres Bildlauffensters, das rosa die Größe Ihres Inhalts (Ihres Bildes):

enter image description here

10
Matthias Bauch

Ich stellte fest, dass ich ein ähnliches Problem hatte, aber keiner der obigen Codes funktionierte. Das Problem war auf Autolayout zurückzuführen. Ich habe festgestellt, dass das Scrollen funktioniert, wenn ich das automatische Layout deaktiviert habe, indem ich im Storyboard auf Dienstprogramme -> Datei-Inspektor geklickt und Use Autolayout Deaktiviert habe (ich habe auch scroll.contentSize = ... Eingestellt).

6
Julius

Seit Xcode 5 funktioniert es nicht mehr wie bisher. Auch das Scrollen zum Ende eines scrollbaren Textfeldes bereitet Probleme. Es gibt auch Unterschiede zwischen dem iPhone oder iPad. Auf dem iPhone funktionierte es ohne Zeitverzögerung.

Das hat bei mir funktioniert:

- (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

Ich bin auf das gleiche Problem unter iOS6 gestoßen, und die Lösung bestand darin, das ContentSize programmgesteuert anzupassen. Also zitiere ich einfach aus Raja (oben), um dies zu zeigen:

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

ANMERKUNG: Ich hatte dieses Problem nicht unter iOS5. Es scheint, dass iOS6 sich dazu entschlossen hat, eine Menge Streiche zu spielen, genau wie bei der Rotations-/Orientierungssaga

6
Khayrattee

Swift 4, iOS 11

Der einfachste Weg mit Autolayout:

  1. Fügen Sie UIScrollView hinzu und fixieren Sie es 0,0,0,0 zur Übersicht (oder Ihrer gewünschten Größe)
  2. Fügen Sie UIView in ScrollView hinzu, heften Sie es 0,0,0,0 an alle 4 Seiten und zentrieren Sie es horizontal und vertikal.
  3. Ändern Sie im Größeninspektor die Priorität "Unten" und "Mitte Y ausrichten" auf 250.
  4. Fügen Sie dieser Ansicht alle Ansichten hinzu, die Sie benötigen. Nicht vergessen um die unterste Einschränkung für die unterste Ansicht festzulegen.
4

Vergessen Sie nicht, das hinzuzufügen kategorie Protokoll an die Schnittstelle, wie folgt

@interface MyViewController : <UIScrollViewDelegate>

Wenn Sie dies nicht tun, können Sie den Stellvertreter für die Bildlaufansicht nicht auf "Selbst" setzen

(d. h. [MyScrollView setDelegate:self];)

Wenn Sie dies tun, sollte es funktionieren.

Mein Code ist:

-(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

Manchmal ist im xib das Kontrollkästchen autoLayout aktiviert. Dadurch wird dieses Problem auch in xcode 5 verursacht. Dadurch wird der Bildlauf von UIScrollView abgebrochen.

3
Vinay Kumar

Haben Sie den Ansichtsdelegierten der Schriftrolle zugewiesen? Denken Sie immer daran:

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

Die Bildansicht muss eine Unteransicht (also innerhalb UND unterhalb) der Bildlaufansicht sein. Ihrer Beschreibung nach scheinen sie parallel zu sein

1
Tomen

Du hast eine Zeile vergessen. Fügen Sie dies zu Ihrer Ansichtsladefunktion hinzu:

[scrollView setScrollEnabled:YES];
1
Sirens

Sie können versuchen, AutoLayout zu deaktivieren. In XCode 5 habe ich alle oben genannten Antworten getestet und konnte nur einen Bildlauf durchführen, indem ich das automatische Layout deaktivierte und alle Masken für die automatische Größe im Größeninspektor aktivierte. Der folgende Code wurde ebenfalls verwendet:

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

Fügen Sie einfach Code hinzu

scrollView.contentSize = CGSizeMake(WIDTH,HEIGHT);

zur Methode - (void) viewDidLayoutSubviews. Weitere Informationen finden Sie in der Stanford CS193p-Vorlesung Nr. 8 zum Verständnis des View Controller-Lebenszyklus.

0
iOS_Dev

Ich hatte das gleiche Problem und suchte nach der Antwort in diesem Thread. Ich habe alle Sachen ausprobiert, aber nichts funktioniert. Dann habe ich folgendes gefunden:

deselect Use Auto Layout.

Sie müssen nur "Use Auto Layout" im Datei-Inspektor Ihres ViewController deaktivieren. Ta-Da, es funktioniert sofort für mich. Genießen.

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

Angenommen, scrollView ist eine Unteransicht der Ansicht und füllt sie vollständig aus, können Sie in viewDidLoad Folgendes verwenden:

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

Ich hatte eine UIScrollView, die nicht scrollte, und dies erlaubte es zu scrollen.

0
cdavidyoung