프로그래밍 방식으로 UIScrollView를 스크롤


159

나는 UIScrollView몇 가지 견해를 가지고 있습니다. 사용자가 손가락을 쓸어 넘기는 경우 손가락의 방향에 따라보기가 오른쪽 또는 왼쪽으로 스크롤됩니다. 기본적으로 내 코드는 iPhone 사진 앱과 비슷한 방식으로 작동합니다. 이제 프로그래밍 방식으로 동일한 작업을 수행 할 수있는 방법이 있습니까? 버튼을 클릭하고 각 스크롤 사이에서 구성 가능한 일시 중지로 자체 실행되는 슬라이드 쇼로 끝납니다.

슬라이드 쇼를 UIScrollView어떻게 사용 합니까?

답변:


391

Objective-C의 다음 명령문 중 하나를 사용하여 스크롤보기에서 특정 지점으로 스크롤 할 수 있습니다.

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

또는 스위프트

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

Apple의 " 스크롤보기 내용 스크롤 "안내서도 참조하십시오 .

로 슬라이드 쇼를 수행하려면 UIScrollView스크롤보기에서 모든 이미지를 정렬하고 반복 타이머를 설정 한 다음 -setContentOffset:animated:타이머가 실행될 때

그러나보다 효율적인 방법은 2 개의 이미지보기를 사용하고 전환을 사용하거나 타이머가 실행될 때 단순히 위치를 전환하여 이미지를 바꾸는 것입니다. 자세한 내용은 iPhone 이미지 슬라이드 쇼 를 참조하십시오.


1
멋있는. 예, setContentOffset이 작동한다는 것을 알았지 만 실제로 애니메이션 방식으로 발생하기를 원했습니다. 'animated : YES'가 트릭을 수행했습니다.
climben February

3
x 매개 변수 use에 대해 UIScrollView의 다음 "페이지"(iPhone으로 코딩한다고 가정)를 가로로 이동하려면 답을 보완하십시오 (myScrollView.contentOffset.x +320).
Giovanni

2
@niraj 고마워 친구 ...에 (myScrollView.contentOffset.x +320)열쇠가 있습니다!
D_D

5
내가 틀렸다면 수정하지만 UIScrollView contentOffset:는 contentSize도 오프셋하므로 바람직하지 않습니다. 스크롤 만하려면을 사용할 수 있습니다 scrollRectToVisible:.
Chris

CGPointMakeSwift 와 같은 C 도우미 기능을 사용하지 마십시오 . 간단히 스위프트 구조체를 직접 빌드하십시오 :CGPoint(x: 0, y: 44)
Arnold

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 2016 년

나는 이와 같은 간단한 답변을 좋아합니다.
quemeful

실제로 이것은 허용되는 답변과 다릅니다. 허용되는 답변에는 애니메이션 옵션이 있으며 일부 앱은 YES로 설정하려고 할 수 있습니다.
Rickster

11

스위프트 애니메이션

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

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



3

스위프트 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
당신의 대답에,뿐만 아니라 순수 코드를 텍스트를 추가하는 것을 고려하십시오
user1781290
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.