Программная прокрутка UIScrollView


159

У меня UIScrollViewесть несколько просмотров. Когда пользователь щелкает пальцем, вид прокручивается вправо или влево в зависимости от направления движения пальца. В основном мой код работает так же, как приложение для фотографий iPhone. Теперь, есть ли способ, которым я могу программно сделать то же самое, чтобы в итоге я получил слайд-шоу, которое запускается само по себе нажатием кнопки и настраиваемой паузой между каждой прокруткой?

Как вы действительно делаете слайд-шоу UIScrollView?

Ответы:


391

Вы можете прокрутить до некоторой точки в представлении прокрутки с помощью одного из следующих утверждений в Objective-C

[scrollView setContentOffset:CGPointMake(x, y) animated:YES];

или Свифт

scrollView.setContentOffset(CGPoint(x: x, y: y), animated: true)

См. Также руководство « Прокрутка прокрутки просмотра содержимого » от Apple .

Чтобы сделать слайд-шоу с помощью UIScrollView, вы упорядочиваете все изображения в режиме прокрутки, настраиваете повторный таймер, а затем -setContentOffset:animated:запускаете его.

Но более эффективный подход состоит в том, чтобы использовать 2 вида изображений и менять их местами, используя переходы или просто переключая места при срабатывании таймера. См. Слайд-шоу iPhone Image для деталей.


1
Прохладно. Да, я обнаружил, что setContentOffset работает, но очень хотел, чтобы это происходило в анимации. 'animated: YES' сделал свое дело.
Climbon

3
Просто дополняя ответ, перейдите по горизонтали к следующей «странице» в UIScrollView (при условии, что вы кодируете для iPhone) для использования параметра x (myScrollView.contentOffset.x +320).
Джованни

2
@niraj спасибо, чувак ... во (myScrollView.contentOffset.x +320)лжи ключ!
D_D

5
Поправьте меня, если я ошибаюсь, но UIScrollView's contentOffset:также компенсирует contentSize, что может быть нежелательно. Чтобы только прокручивать, вы можете использовать scrollRectToVisible:.
Крис

Не используйте вспомогательные функции C, как CGPointMakeв Swift. Просто создайте структуру Swift напрямую:CGPoint(x: 0, y: 44)
Арнольд

42

Если вы хотите контролировать продолжительность и стиль анимации, вы можете сделать:

[UIView animateWithDuration:2.0f delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
    scrollView.contentOffset = CGPointMake(x, y);
} completion:NULL];

Настройте продолжительность ( 2.0f) и параметры ( UIViewAnimationOptionCurveLinear) по вкусу!


11

Другой способ

scrollView.contentOffset = CGPointMake(x,y);

14
Это точно так же, как принятый ответ. И CGPointдолжно быть CGPointMake.
Эван Мулавски

Мне нравятся простые ответы, подобные этому.
унылый

На самом деле, это не то же самое, что принятый ответ. Принятый ответ имеет анимированную опцию, которую некоторые приложения могут захотеть установить в YES.
Рикстер


6

Я поражен, что этой теме уже 9 лет, и настоящего простого ответа здесь нет!

То, что вы ищете, это scrollRectToVisible(_:animated:) .

Пример:

extension SignUpView: UITextFieldDelegate {
    func textFieldDidBeginEditing(_ textField: UITextField) {
        scrollView.scrollRectToVisible(textField.frame, animated: true)
    }
}

То, что он делает, это именно то, что вам нужно, и это гораздо лучше, чем взломать contentOffset

Этот метод прокручивает представление содержимого так, чтобы область, определенная прямоугольником, была просто видна внутри представления прокрутки. Если область уже видна, метод ничего не делает.

От: https://developer.apple.com/documentation/uikit/uiscrollview/1619439-scrollrecttovisible



3

Свифт 3

   let point = CGPoint(x: 0, y: 200) // 200 or any value you like.
    scrollView.contentOffset = point


0
- (void)viewDidLoad
{
    [super viewDidLoad];
    board=[[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.height, 80)];
    board.backgroundColor=[UIColor greenColor];
    [self.view addSubview:board];
    // Do any additional setup after loading the view.
}


-(void)viewDidLayoutSubviews
{


    NSString *str=@"ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    index=1;
    for (int i=0; i<20; i++)
    {
        UILabel *lbl=[[UILabel alloc]initWithFrame:CGRectMake(-50, 15, 50, 50)];
        lbl.tag=i+1;
        lbl.text=[NSString stringWithFormat:@"%c",[str characterAtIndex:arc4random()%str.length]];
        lbl.textColor=[UIColor darkGrayColor];
        lbl.textAlignment=NSTextAlignmentCenter;
        lbl.font=[UIFont systemFontOfSize:40];
        lbl.layer.borderWidth=1;
        lbl.layer.borderColor=[UIColor blackColor].CGColor;
        [board addSubview:lbl];
    }

    [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(CallAnimation) userInfo:nil repeats:YES];

    NSLog(@"%d",[board subviews].count);
}


-(void)CallAnimation
{

    if (index>20) {
        index=1;
    }
    UIView *aView=[board viewWithTag:index];
    [self doAnimation:aView];
    index++;
    NSLog(@"%d",index);
}

-(void)doAnimation:(UIView*)aView
{
    [UIView animateWithDuration:10 delay:0 options:UIViewAnimationOptionCurveLinear  animations:^{
        aView.frame=CGRectMake(self.view.frame.size.height, 15, 50, 50);
    }
                     completion:^(BOOL isDone)
     {
         if (isDone) {
             //do Somthing
                        aView.frame=CGRectMake(-50, 15, 50, 50);
         }
     }];
}

8
Пожалуйста, подумайте над тем, чтобы добавить в ответ какой-то текст, а не только чистый код
user1781290
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.