Lập trình cuộn UIScrollView


159

Tôi có một UIScrollViewcái có nhiều quan điểm. Khi người dùng vuốt ngón tay của họ, chế độ xem sẽ cuộn sang phải hoặc trái tùy theo hướng của ngón tay búng. Về cơ bản mã của tôi hoạt động theo cách tương tự như ứng dụng ảnh trên iPhone. Bây giờ, có cách nào để tôi có thể lập trình làm điều tương tự để tôi kết thúc với một trình chiếu tự chạy với một nút bấm và tạm dừng cấu hình giữa mỗi cuộn không?

Làm thế nào để bạn thực sự làm trình chiếu với UIScrollView?

Câu trả lời:


391

Bạn có thể cuộn đến một số điểm trong chế độ xem cuộn bằng một trong các câu lệnh sau trong Objective-C

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

hoặc Swift

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

Xem hướng dẫn " Cuộn nội dung cuộn xem " từ Apple .

Để thực hiện trình chiếu UIScrollView, bạn sắp xếp tất cả các hình ảnh trong chế độ xem cuộn, thiết lập bộ hẹn giờ lặp lại, sau đó -setContentOffset:animated:khi bộ hẹn giờ kích hoạt.

Nhưng một cách tiếp cận hiệu quả hơn là sử dụng 2 chế độ xem hình ảnh và trao đổi chúng bằng cách sử dụng các hiệu ứng chuyển tiếp hoặc đơn giản là chuyển đổi địa điểm khi bộ hẹn giờ kích hoạt. Xem slideshow hình ảnh iPhone để biết chi tiết.


1
Mát mẻ. Vâng, tôi đã thấy rằng setContent Offerset hoạt động nhưng thực sự muốn điều này xảy ra theo cách hoạt hình. 'Hoạt hình: CÓ' đã thực hiện thủ thuật.
climbon

3
Chỉ cần bổ sung câu trả lời, để di chuyển theo chiều ngang đến "trang" tiếp theo trong UIScrollView (giả sử bạn đang mã hóa cho iPhone), để sử dụng tham số x (myScrollView.contentOffset.x +320).
Giovanni

2
@niraj cảm ơn anh bạn ... (myScrollView.contentOffset.x +320)nằm ở chìa khóa!
D_D

5
Sửa lỗi cho tôi nếu tôi sai, nhưng UIScrollView cũng contentOffset:sẽ bù đắp cho kích thước nội dung, điều này có thể không được mong muốn. Để chỉ cuộn, bạn có thể muốn sử dụng scrollRectToVisible:.
Chris

Không sử dụng các hàm trợ giúp C như CGPointMaketrong Swift. Đơn giản chỉ cần xây dựng một cấu trúc Swift trực tiếp:CGPoint(x: 0, y: 44)
Arnold

42

Nếu bạn muốn kiểm soát thời lượng và phong cách của hình ảnh động, bạn có thể làm:

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

Điều chỉnh thời lượng ( 2.0f) và tùy chọn ( UIViewAnimationOptionCurveLinear) để nếm thử!


11

Một cách khác là

scrollView.contentOffset = CGPointMake(x,y);

14
Điều này chính xác giống như câu trả lời được chấp nhận. Và CGPointnên được CGPointMake.
Evan Mulawski

Tôi thích câu trả lời đơn giản như thế này.
tuyệt vời

Trên thực tế, đây không giống như câu trả lời được chấp nhận. Câu trả lời được chấp nhận có tùy chọn hoạt hình mà một số ứng dụng có thể muốn đặt thành CÓ.
Rickster

11

Với hoạt hình trong Swift

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

6

Tôi ngạc nhiên khi chủ đề này đã 9 tuổi và câu trả lời thẳng thắn thực tế không có ở đây!

Những gì bạn đang tìm kiếm là scrollRectToVisible(_:animated:).

Thí dụ:

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

Những gì nó làm là chính xác những gì bạn cần, và nó tốt hơn nhiều so với hacky contentOffset

Phương pháp này cuộn chế độ xem nội dung sao cho khu vực được xác định bởi trực tràng chỉ hiển thị bên trong chế độ xem cuộn. Nếu khu vực này đã được nhìn thấy, phương thức không làm gì cả.

Từ: 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


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
Vui lòng xem xét thêm một số văn bản vào câu trả lời của bạn, không chỉ mã thuần túy
user1781290
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.