Програмно прокручувати 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 працює, але дуже хотів, щоб це відбувалося анімовано. "анімований: ТАК" зробив свою справу.
підйомник

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

2
@niraj дякую чувак ... у (myScrollView.contentOffset.x +320)брехні ключ!
D_D

5
Виправте мене, якщо я помиляюся, але UIScrollView 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.
Еван Мулавський

Мені подобаються прості відповіді, як ця.
пам’ятний

Власне, це не те саме, що прийнята відповідь. У прийнятій відповіді є опція анімованості, яку, можливо, деякі додатки можуть встановити ТАК.
Рікстер


6

Я вражений, що цій темі вже 9 років, а фактичної прямої відповіді тут немає!

Що ви шукаєте, так і є scrollRectToVisible(_:animated:).

Приклад:

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

Що це робить, це саме те, що вам потрібно, і це набагато краще, ніж хакі contentOffset

Цей метод прокручує подання вмісту, щоб область, визначена rect, була просто видимою всередині подання прокрутки. Якщо область вже видно, метод нічого не робить.

Від: 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.