2010-02-10 2 views
121

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

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

ответ

317

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

[scrollView scrollRectToVisible:CGRectMake(x, y, 1, 1) animated:YES]; 
// or 
[scrollView setContentOffset:CGPointMake(x, y) animated:YES]; 

или Swift

scrollView.scrollRectToVisible(CGRect(x: x, y: y, width: 1, height: 1), animated: true) 
// or 
scrollView.setContentOffset(CGPoint(x: x, y: y), animated: true) 

См guide "Scrolling the Scroll View Content" from Apple as well.

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

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

+1

Круто. Да, я нашел, что setContentOffset работает, но действительно хотел, чтобы это произошло анимированным образом. «Анимированный: ДА» сделал трюк. – climbon

+2

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

+2

@niraj спасибо чувак ... в '(myScrollView.contentOffset.x +320)' лежит ключ! –

10

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

scrollView.contentOffset = CGPointMake(x,y); 
+13

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

+0

Мне нравятся простые ответы вроде этого. – quemeful

+0

Собственно, это не то же самое, что и принятый ответ. В принятом ответе есть опция анимации, которую некоторые приложения могут пожелать установить в YES. – Rickster

35

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

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

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

1
- (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 *[email protected]"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); 
     } 
    }]; 
} 
+7

Пожалуйста, подумайте над тем, чтобы добавить текст к вашему ответу, а не только чистый код – user1781290

6

с анимацией в Swift

scrollView.setContentOffset(CGPointMake(x, y), animated: true) 
1
[Scrollview setContentOffset:CGPointMake(x, y) animated:YES]; 
3

Swift 3

let point = CGPoint(x: 0, y: 200) // 200 or any value you like. 
    scrollView.contentOffset = point 
Смежные вопросы