โปรแกรมเลื่อน UIScrollView


159

ฉันมีUIScrollViewที่มีหลายมุมมอง เมื่อผู้ใช้เลื่อนนิ้วของพวกเขามุมมองเลื่อนไปทางขวาหรือซ้ายขึ้นอยู่กับทิศทางของการตวัดนิ้ว โดยทั่วไปรหัสของฉันทำงานในลักษณะคล้ายกับแอพถ่ายรูป iPhone ตอนนี้จะมีวิธีที่ฉันสามารถเขียนโปรแกรมทำสิ่งเดียวกันเพื่อที่ฉันจะจบลงด้วยสไลด์โชว์ที่วิ่งบนของตัวเองด้วยการคลิกปุ่มและหยุดการทำงานชั่วคราวที่กำหนดระหว่างแต่ละเลื่อนหรือไม่?

คุณทำสไลด์โชว์UIScrollViewอย่างไร?

คำตอบ:


391

คุณสามารถเลื่อนไปยังจุดในมุมมองเลื่อนบางคนที่มีหนึ่งของงบต่อไปนี้ใน Objective-C

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

หรือสวิฟท์

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

ดูคู่มือ " เลื่อนเลื่อนดูเนื้อหา " จากแอปเปิ้ลได้เป็นอย่างดี

ในการทำสไลด์โชว์ด้วยUIScrollViewคุณจัดเรียงรูปภาพทั้งหมดในมุมมองเลื่อนตั้งค่าตัวจับเวลาซ้ำแล้วจากนั้น-setContentOffset:animated:เมื่อตัวจับเวลาเริ่มทำงาน

แต่วิธีที่มีประสิทธิภาพมากขึ้นคือการใช้มุมมองภาพ 2 ภาพและสลับเป็นมุมมองแบบเปลี่ยนภาพหรือเปลี่ยนสถานที่เมื่อตัวจับเวลาเริ่มทำงาน ดูภาพสไลด์ iPhone รูปภาพสำหรับรายละเอียด


1
เย็น. ใช่ฉันพบว่า setContentOffset ใช้งานได้ แต่ต้องการให้สิ่งนี้เกิดขึ้นในแบบเคลื่อนไหว 'animated: YES' ได้หลอกลวง
climbon

3
เพียงแค่เมี่ยงคำตอบที่จะย้ายในแนวนอนเพื่อ "หน้า" ต่อไปใน UIScrollView (สมมติว่าคุณเขียนโปรแกรมสำหรับ iPhone) (myScrollView.contentOffset.x +320)สำหรับการใช้งานพารามิเตอร์
Giovanni

2
@niraj ขอบคุณเพื่อน ... ในการ(myScrollView.contentOffset.x +320)โกหกที่สำคัญ!
D_D

5
แก้ไขฉันถ้าฉันผิด แต่ UIScrollView contentOffset:จะชดเชยขนาดเนื้อหาด้วยซึ่งอาจไม่เป็นที่ต้องการ scrollRectToVisible:เพียงเลื่อนคุณอาจต้องการที่จะใช้
Chris

อย่าใช้ฟังก์ชั่นตัวช่วย C เช่นCGPointMakeใน Swift เพียงแค่สร้าง struct สวิฟท์โดยตรงได้ที่: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
Evan Mulawski

ฉันชอบคำตอบง่ายๆเช่นนี้
quemeful

จริงๆแล้วนี่ไม่ใช่คำตอบที่ยอมรับ คำตอบที่ได้รับการยอมรับมีตัวเลือกในการเคลื่อนไหวซึ่งแอพพลิเคบางคนอาจจะต้องการที่จะมีการตั้งเป็นใช่
Rickster


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





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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.