Подтвердить что ты не робот

IOS - UIScrollView не работает (он не прокручивается вообще - изображение остается фиксированным)

Я хотел бы отобразить изображение (ширина: 320 пикселей, высота: 1250 пикселей) в представлении изображения.

Когда я компилирую приложение, я вообще не прокручиваю. Вид остается фиксированным.

Что я сделал:

  • Добавил UIScrollView через Interface Builder.
  • Добавил UIImageView через Interface Builder в мое представление.
  • Проверено, что UIImageView находится ниже UIScrollView в Interface Builder.
  • Задайте размер 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

4b9b3361

Ответ 1

Я просто сделал ту же задачу. Попробуйте это...

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

Ответ 2

Поэтому для меня проблема заключалась в том, что настройка размера содержимого не работала в viewDidLoad(). Я пробовал все, и я не понимал, почему он не захочет работать, а затем я попробовал то же самое в viewDidAppear(), и он волшебным образом работал...

Ответ 3

Из последнего скриншота и из ваших комментариев это похоже на то, что ваш scrollView - путь к большому. Прокрутка должна быть полностью видимой на экране. Например, полный экран UIScrollView на iPhone будет иметь размер 320 x 460.

Если scrollview имеет тот же размер, что и его контент, вы не можете прокручивать.

Зеленоватый прямоугольник показывает размер вашего scrollview, розоватый размер вашего контента (ваше изображение):

enter image description here

Ответ 4

Я столкнулся с этой же проблемой на iOS6, и решение заключалось в том, чтобы программно настроить ContentSize. Поэтому я просто процитирую Raja (выше), чтобы показать это:

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

ПРИМЕЧАНИЕ. У меня не было этой проблемы на iOS5. Кажется, что iOS6 решил сделать много шуток, как сага о ротации/ориентации

Ответ 5

Так как 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

Я обнаружил, что у меня была аналогичная проблема, но ни один из вышеперечисленных кодов не работал. Проблема была вызвана автозапуском. Я обнаружил, что если отключить автозапуск, перейдя на раскадровку, щелкнув "Утилиты" → "Инспектор файлов" и снял флажок Use Autolayout, прокрутка работала (я также установил scroll.contentSize = ...).

Ответ 7

Не забудьте добавить протокол category к интерфейсу, например

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

Ответ 8

Иногда флажок autoLayout помечен в xib. Это также создает эту проблему в xcode 5. Что делает прокрутку UIScrollView.

Ответ 9

Назначили ли вы делегат прокрутки? Всегда помните об этом:

[self.scrollView setDelegate:self]; 
[self.scrollView setScrollEnabled:YES];

Ответ 10

Swift 4, iOS 11

Самый простой способ использования автоопределения:

  • Добавьте UIScrollView и запишите его 0,0,0,0 для просмотра (или желаемого размера).
  • Добавьте UIView в ScrollView, наведите его 0,0,0,0 на все 4 стороны и центрируйте его по горизонтали и по вертикали.
  • В инспекторе размеров измените значение "bottom" и "align center Y" на 250.
  • Добавьте все представления, которые вам нужны в этом представлении. Не забудьте установить нижнее ограничение на нижний вид.

Ответ 11

Представление изображения должно быть подвью (так внутри И внизу) прокрутки. Из вашего описания кажется, что они paralell

Ответ 12

Ты забыл одну строку. Добавьте это в свою функцию загрузки:

[scrollView setScrollEnabled:YES];

Ответ 13

Вы можете попробовать отключить AutoLayout. В XCode 5 я протестировал все вышеперечисленные ответы, и я мог только прокручивать его, отключив автоотключение и активировав все маски авторазделения под Инспектором размеров. Также был использован следующий код:

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

Ответ 14

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)];

Ответ 15

Предполагая, что scrollView является подчиненным представлением и полностью заполняет его, вы можете использовать следующее в viewDidLoad:

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

У меня был UIScrollView, который не прокручивался, и это позволяло прокручивать.

Ответ 16

У меня была такая же проблема, и я искал ответ в этой теме. Я пробовал все, но ничего не работает. Тогда я нашел это:

deselect Use Auto Layout.

Вам просто нужно отменить выбор "Использовать автоматический макет" в "Инспекторе файлов" вашего ViewController. Та-Да, он работает сразу для меня. Наслаждаться.

Ответ 17

Просто добавьте код

scrollView.contentSize = CGSizeMake(WIDTH,HEIGHT);

для метода - (void) viewDidLayoutSubviews. Для получения дополнительной информации посетите стенд Stanford CS193p. Лекция № 8, чтобы понять жизненный цикл View Controller.