it-swarm.com.ru

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

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

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

137
climbon

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

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

или Свифт

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

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

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

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

356
kennytm

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

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

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

37
Jon Schneider

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

scrollView.contentOffset = CGPointMake(x,y);
10
Sohail Mohabbat Ali

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

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

Свифт 3

   let point = CGPoint(x: 0, y: 200) // 200 or any value you like.
    scrollView.contentOffset = point
3
Alfi
[Scrollview setContentOffset:CGPointMake(x, y) animated:YES];
2
P.J.Radadiya
scrollView.setContentOffset(CGPoint(x: y, y: x), animated: true)
2
CoderPug
- (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);
         }
     }];
}
1
Naveen

Я показываю, как создать простой вид прокрутки с двумя UIView и добавить некоторые ограничения автоматического макета, чтобы он плавно прокручивался.

Я предполагаю, что у вас есть пустой контроллер представления в main.storyboard.

1. Добавьте UIView.

let view = UIView()
    view.backgroundColor = UIColor.green
    self.view.addSubview(view)
    view.translatesAutoresizingMaskIntoConstraints = false
    top = view.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0)
    left = view.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 0)
    right = view.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: 0)
    bottom = view.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0)
    height = view.heightAnchor.constraint(equalToConstant: self.view.frame.height)
    NSLayoutConstraint.activate([top, right, left, height, bottom])

2. Добавьте ScrollView.

let scroll = UIScrollView()
    scroll.backgroundColor = UIColor.red
    view.addSubview(scroll)
    scroll.translatesAutoresizingMaskIntoConstraints = false
    top = scroll.topAnchor.constraint(equalTo: view.topAnchor, constant: 10)
    left = scroll.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0)
    right = scroll.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0)
    bottom = scroll.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -10)
    NSLayoutConstraint.activate([top, right, left, bottom])

3.Добавьте первый UILabel.

 let l2 = UILabel()
        l2.text = "Label1"
        l2.textColor = UIColor.black
        l2.backgroundColor = UIColor.blue
        scroll.addSubview(l2)
        l2.translatesAutoresizingMaskIntoConstraints = false
        top = l2.topAnchor.constraint(equalTo: scroll.topAnchor, constant: 10)
        left = l2.leadingAnchor.constraint(equalTo: scroll.leadingAnchor, constant: 10)
        height = l2.heightAnchor.constraint(equalToConstant: 100)
        right = l2.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -10)
        NSLayoutConstraint.activate([top, left, right, height])

4.Добавить второй UILabel.

let l1 = UILabel()
    l1.text = "Label2"
    l1.textColor = UIColor.black
    l1.backgroundColor = UIColor.blue
    scroll.addSubview(l1)
    l1.translatesAutoresizingMaskIntoConstraints = false
    top = l1.topAnchor.constraint(equalTo: scroll.topAnchor, constant: 1000)
    left = l1.leadingAnchor.constraint(equalTo: scroll.leadingAnchor, constant: 10)
    bottom = l1.bottomAnchor.constraint(equalTo: scroll.bottomAnchor, constant: -10)
    height = l1.heightAnchor.constraint(equalToConstant: 100)
    right = l1.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -10)
    NSLayoutConstraint.activate([left, bottom, right, height, top])

Label1 enter image description here

0
Shiv Prakash

Я поражен, что этой теме уже 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

0
vol