2013-07-04 3 views
4

스크롤하지 않는 UIScrollView가 있습니다. 수신 거부 기능을 사용하도록 설정하면보기가 아닌 콘텐츠가있는 것을 확인하기 위해 측면까지 충분히 스크롤 할 수 있지만 놓을 때 원본으로 바로 돌아갑니다. 페이징이 켜져 있지만 페이징을 해제하면 동일한 동작이 발생합니다. 자동 레이아웃이 해제되어 있습니다. IB에서 scrollView는 MainViewController에 있으며, 아래와 같이 IBOutlet과 올바르게 연결됩니다.UIScrollView 스크롤하지 않습니다.

@interface MainViewController() 

@property (strong, nonatomic) IBOutlet UIScrollView *scrollView; 

@end 

@implementation MainViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    for (int i = 0; i < 3; i++) { 
     CGRect frame; 
     frame.origin.x = self.scrollView.frame.size.width * i; 
     frame.origin.y = 0; 
     frame.size = self.scrollView.frame.size; 

     // I might be doing this wrong, but it returns a PosterView object just like I want it to. 
     NSArray *view = [[NSBundle mainBundle] loadNibNamed:@"posterView" owner:self options:nil]; 
     [[view objectAtIndex:0] setFrame:frame]; 

     [self.scrollView addSubview:[view objectAtIndex:0]]; 
    } 

    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * 3, self.scrollView.frame.size.height); 
} 

이 방법을 사용하면 제대로 스크롤됩니다.

-(void)scrollToPage:(NSInteger)page{ 
    float pageWidth = [self.scrollView frame].size.width; 
    [self.scrollView setContentOffset:CGPointMake(page*pageWidth,0) animated:YES]; 
} 

나는 UIScrollViewDelegate 및 최우선 scrollViewDidScroll을 구현하는 시도하지만,이 호출되지 않습니다 (내가 앞서 언급 한 것처럼, 수신 거부 가능하지 않는 한).

답변

8

UIScrollView은 프레임 크기보다 큰 contentSize 인 경우에만 스크롤합니다. 스크롤하지 않으면 contentSize 크기가 충분하지 않을 수도 있습니다. 그러므로 설정 후 contentSize이 무엇인지 확인하십시오.

contentSize이 예상대로라면 scrollView가 scrollEnabled인지 확인하십시오. 때로는 바운스를 사용하면 스크롤이 작동하는 것처럼 느껴질 수 있습니다. 또한 스크롤을 사용할 수없는 경우 contentOffset을 설정하면 제공된 크기에 따라 콘텐츠를 인수로 이동하기 때문에 해당 경우에도 작동합니다.

+0

contentSize.width는 960이고 프레임은 분명히 320이므로 문제가되지 않아야합니다. 스크롤링이 IB에서 활성화되도록 설정되었으며 코드에서 시도했지만 성공하지 못했습니다! –

+1

제공하신 코드가 정상적으로 보입니다. 전체 콘텐츠 크기는 3 * 320,480으로 유지됩니까? 아니면 어떻게 든 다시 설정하십시오 – Zen

+0

맞아요, 그것은 viewDidLoad 후 재설정합니까! 처음으로 스크롤하려고 할 때 contentSize를 설정하면 이제 작동합니다! 고맙습니다. –

3

viewDidLayoutSubviews 안에 contentSize을 설정해야합니다. 뷰 라이프 사이클에서 다른 메소드로 리셋되지 않도록 충분히 늦었으며 뷰가 처음으로 스크롤되는지 여부를 확인할 필요가 없습니다.

+0

+1 이것은 나를 위해서만 작동하는 해결책입니다. 또한 scrollView를 컨트롤러 뷰의 하위 뷰로 지정해야합니다 (scrollView는 직접 컨트롤러 뷰가 될 수 없습니다). 이상한데 ... – JakubKnejzlik

+0

제약 조건 때문에 viewSize가 내 contentSize를 덮어 쓰게되었지만 constraint가 contentSize에 영향을 미치는 이유는 무엇입니까? 때로 제약 조건이 싫어. – inorganik