2012-12-10 3 views
1

배열에 4 개의 이미지가로드 된 How To Use UIScrollView to Scroll and Zoom Content의 "Paging with UIScrollView"섹션을 수행하고 있습니다. 나는 이것을 UITabController에서로드하고 있으며 스토리 보드의 첫 번째보기 컨트롤러라고 언급해야합니다.UITabController 내에서 UIScrollview를 사용하여 모든 페이지를 표시하지 않는 UIImageView 표시

한 페이지 컨트롤이 점은 전혀 움직이지 않는있는 UIScrollView에서 업데이트 (응답하지 않고 페이지의 정확한 수와 계산 : 뷰로드 할 때 몇 가지 이유를 들어

는 두 가지 문제가 발생).

둘째, 처음 두 페이지 만로드되어 loadVisiblePages 메소드가 작동하지 않는다고 생각하게합니다.

View Controller의 첫 번째 응답자로부터 유선 연결은 pageControl에 대한 페이지 컨트롤과 scrollview에 대한 view 컨트롤이며, View (기본값)와 마지막으로 relationship segue를 볼 수 있습니다.

업데이트 : 방금이 문제에 대해 흥미로운 것을 발견했습니다. 3 페이지 (배열의 일명 3 이미지)로 이동하면 이미지를 볼 수 없습니다. 그러나 탭을 전환하면 페이지 컨트롤과 이미지가 올바르게 표시됩니다.

머리글 :

#import <UIKit/UIKit.h> 

@interface TutorialViewController : UIViewController <UIScrollViewDelegate> 

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

@end 

구현 :

#import "TutorialViewController.h" 

@interface TutorialViewController() 
@property (nonatomic, strong) NSArray *pageImages; 
@property (nonatomic, strong) NSMutableArray *pageViews; 

- (void)loadVisiblePages; 
- (void)loadPage:(NSInteger)page; 
- (void)purgePage:(NSInteger)page; 
@end 

@implementation TutorialViewController 

@synthesize scrollView = _scrollView; 
@synthesize pageControl = _pageControl; 

@synthesize pageImages = _pageImages; 
@synthesize pageViews = _pageViews; 

- (void)loadPage:(NSInteger)page { 
    if (page < 0 || page >= self.pageImages.count) { 
     // If it's outside the range of what you have to display, then do nothing 
     return; 
    } 

    // 1 
    UIView *pageView = [self.pageViews objectAtIndex:page]; 
    if ((NSNull*)pageView == [NSNull null]) { 
     // 2 
     CGRect frame = self.scrollView.bounds; 
     frame.origin.x = frame.size.width * page; 
     frame.origin.y = 0.0f; 

     // 3 
     UIImageView *newPageView = [[UIImageView alloc] initWithImage:[self.pageImages objectAtIndex:page]]; 
     newPageView.contentMode = UIViewContentModeScaleAspectFit; 
     newPageView.frame = frame; 
     [self.scrollView addSubview:newPageView]; 
     // 4 
     [self.pageViews replaceObjectAtIndex:page withObject:newPageView]; 
    } 
} 

- (void)purgePage:(NSInteger)page { 
    if (page < 0 || page >= self.pageImages.count) { 
     // If it's outside the range of what you have to display, then do nothing 
     return; 
    } 

    // Remove a page from the scroll view and reset the container array 
    UIView *pageView = [self.pageViews objectAtIndex:page]; 
    if ((NSNull*)pageView != [NSNull null]) { 
     [pageView removeFromSuperview]; 
     [self.pageViews replaceObjectAtIndex:page withObject:[NSNull null]]; 
    } 
} 

- (void)loadVisiblePages { 
    // First, determine which page is currently visible 
    CGFloat pageWidth = self.scrollView.frame.size.width; 
    NSInteger page = (NSInteger)floor((self.scrollView.contentOffset.x * 2.0f + pageWidth)/(pageWidth * 2.0f)); 

    // Update the page control 
    self.pageControl.currentPage = page; 

    // Work out which pages you want to load 
    NSInteger firstPage = page - 1; 
    NSInteger lastPage = page + 1; 

    // Purge anything before the first page 
    for (NSInteger i=0; i<firstPage; i++) { 
     [self purgePage:i]; 
    } 

    // Load pages in our range 
    for (NSInteger i=firstPage; i<=lastPage; i++) { 
     [self loadPage:i]; 
    } 

    // Purge anything after the last page 
    for (NSInteger i=lastPage+1; i<self.pageImages.count; i++) { 
     [self purgePage:i]; 
    } 
} 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    // Load the pages that are now on screen 
    [self loadVisiblePages]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // 1 
    self.pageImages = [NSArray arrayWithObjects: 
         [UIImage imageNamed:@"640x960 tutorial_1.png"], 
         [UIImage imageNamed:@"640x960 tutorial_2.png"], 
         [UIImage imageNamed:@"640x960 tutorial_3.png"], 
         [UIImage imageNamed:@"640x960 tutorial_4.png"], 
         nil]; 

    NSInteger pageCount = self.pageImages.count; 

    // 2 
    self.pageControl.currentPage = 0; 
    self.pageControl.numberOfPages = pageCount; 

    // 3 
    self.pageViews = [[NSMutableArray alloc] init]; 
    for (NSInteger i = 0; i < pageCount; ++i) { 
     [self.pageViews addObject:[NSNull null]]; 
    } 
} 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    // 4 
    CGSize pagesScrollViewSize = self.scrollView.frame.size; 
    self.scrollView.contentSize = CGSizeMake(pagesScrollViewSize.width * self.pageImages.count, pagesScrollViewSize.height); 

    // 5 
    [self loadVisiblePages]; 
} 

@end 
+0

업데이트 : 방금이 문제에 대해 흥미로운 것을 발견했습니다. 3 페이지 (배열의 일명 3 이미지)로 이동하면 이미지를 볼 수 없습니다. 그러나 탭을 전환하면 페이지 컨트롤과 이미지가 올바르게 표시됩니다. – Macness

답변

2

나는 마침내 그것을 알아 냈어.

사용자 오류. 스토리 보드에 ViewController가 델리게이트로 링크 된 뷰가 없습니다.

고마워. 다른 사람들이 2 일 동안 머리를 뺄 필요가 없는데 도움이 되었기를 바랍니다.