Scorri a livello di codice un UIScrollView


159

Ho un UIScrollViewche ha diversi punti di vista. Quando un utente fa scorrere il dito, la vista scorre verso destra o sinistra a seconda della direzione del movimento del dito. Fondamentalmente il mio codice funziona in modo simile all'app per foto di iPhone. Ora, c'è un modo in cui posso fare programmaticamente la stessa cosa in modo da finire con una presentazione che funziona da sola con un clic di un pulsante e una pausa configurabile tra ogni scorrimento?

Come si fanno davvero le presentazioni con UIScrollView?

Risposte:


391

È possibile scorrere fino a un certo punto in una vista di scorrimento con una delle seguenti istruzioni in Objective-C

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

o Swift

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

Vedi anche la guida " Scorrimento del contenuto Visualizza scorrimento " da Apple .

Per creare presentazioni UIScrollView, disponi tutte le immagini nella vista di scorrimento, imposta un timer ripetuto, quindi -setContentOffset:animated:quando scatta il timer.

Ma un approccio più efficiente consiste nell'utilizzare 2 visualizzazioni di immagini e scambiarle utilizzando le transizioni o semplicemente cambiando posizione quando il timer scatta. Vedi la presentazione di immagini iPhone per i dettagli.


1
Freddo. Sì, ho scoperto che setContentOffset funziona ma volevo davvero che ciò accadesse in modo animato. 'animato: SÌ' ha fatto il trucco.
climbon,

3
Basta integrare la risposta, per passare orizzontalmente alla successiva "pagina" in UIScrollView (supponendo che si stia codificando per iPhone), per l'uso del parametro x (myScrollView.contentOffset.x +320).
Giovanni,

2
@niraj grazie amico ... (myScrollView.contentOffset.x +320)sta la chiave!
D_D,

5
Correggimi se sbaglio, ma UIScrollView contentOffset:compenserà anche contentSize, il che potrebbe non essere desiderabile. Per scorrere solo, potresti voler usare scrollRectToVisible:.
Chris,

Non utilizzare le funzioni dell'helper C come CGPointMakein Swift. Basta costruire direttamente una struttura Swift:CGPoint(x: 0, y: 44)
Arnold l'

42

Se vuoi controllare la durata e lo stile dell'animazione, puoi fare:

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

Regola la durata ( 2.0f) e le opzioni ( UIViewAnimationOptionCurveLinear) a piacere!


11

Un altro modo è

scrollView.contentOffset = CGPointMake(x,y);

14
Questo è esattamente lo stesso della risposta accettata. E CGPointdovrebbe essere CGPointMake.
Evan Mulawski,

Mi piacciono le risposte semplici come questa.
quemeful

In realtà, questa non è la stessa della risposta accettata. La risposta accettata ha un'opzione animata, che alcune app potrebbero voler impostare su SÌ.
Rickster,

11

Con animazione in Swift

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

6

Sono sorpreso che questo argomento abbia 9 anni e la vera risposta diretta non è qui!

Quello che stai cercando è scrollRectToVisible(_:animated:).

Esempio:

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

Quello che fa è esattamente ciò di cui hai bisogno, ed è molto meglio di hacky contentOffset

Questo metodo scorre la vista del contenuto in modo che l'area definita da rect sia appena visibile all'interno della vista di scorrimento. Se l'area è già visibile, il metodo non fa nulla.

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


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

3

Swift 3

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

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

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
Ti preghiamo di considerare di aggiungere un po 'di testo alla tua risposta, non solo codice puro
user1781290,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.