0

ページコントロールでスクロールビューを実装しました。SizeClass (wAny,hAny) を持ついくつかの XIB があります。各 Viewcontroller のビューを追加するときの幅は 600*600 ですが、ページを変更するときの幅は iphone 5 では 320*568 です。前もって感謝します。

これが私のコードです:

#define CONTENT_VIEW_HEIGHT     495
#define CONTENT_VIEW_SPACING    0
#define SCROLL_VIEW_PADDING     0

#define FIRST_PAGE              0
#define LAST_PAGE               self.numberOfPages - 1


@interface MLKPageViewController ()

@property(nonatomic,strong) NSArray *contentVCs;
@property(nonatomic,assign) NSInteger numberOfPages;
@property(nonatomic,assign) BOOL pageControlUsed;

@end

@implementation MLKPageViewController

@synthesize contentVCs;
@synthesize numberOfPages;
@synthesize pageControlUsed;

- (id)initWithContentViewControllers:(NSArray *)aContentVCs
{
    if( self = [super initWithNibName:@"PageViewVC" bundle:nil] )
    {
        self.contentVCs = aContentVCs;
        self.numberOfPages = aContentVCs.count;
    }

    return self;
}

#pragma mark -
#pragma mark View Life Cycle

- (void)viewDidLoad
{
    [super viewDidLoad];

    mlkPageControl.numberOfPages = self.numberOfPages;
    mlkPageControl.currentPageIndicatorTintColor = [UIColor blackColor];

    [self setupContentViews];
}

#pragma mark -
#pragma mark UIScrollViewDelegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if( !pageControlUsed )
    {
        CGFloat pageWidth = contentScrollView.frame.size.width;
        int page = floor((contentScrollView.contentOffset.x - pageWidth / 2 ) / pageWidth) + 1;
        mlkPageControl.currentPage = page;
    }
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    pageControlUsed = NO;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    pageControlUsed = NO;
    [self changeContentPage:mlkPageControl];
}

#pragma mark -
#pragma mark Methods

- (void)setupContentViews
{
    contentScrollView.contentSize = CGSizeMake(( self.numberOfPages * ([UIScreen mainScreen].bounds.size.width - 2 * SCROLL_VIEW_PADDING) ) + ( self.numberOfPages + 1 ) * CONTENT_VIEW_SPACING, CONTENT_VIEW_HEIGHT) ;

    for( int i = 0; i < self.numberOfPages; i++ )
    {
        UIView *contentView = ((UIViewController *)[self.contentVCs objectAtIndex:i]).view;
        contentView.frame = CGRectMake( ((i+1) * CONTENT_VIEW_SPACING) + i * contentView.frame.size.width, SCROLL_VIEW_PADDING, contentView.frame.size.width, contentView.frame.size.height);

        [contentScrollView addSubview:contentView];
    }
}

#pragma mark
#pragma mark Actions

- (IBAction)changeContentPage:(id)sender
{
    CGRect pageRect;
    UIView *contentView = ((UIViewController *)[self.contentVCs objectAtIndex:mlkPageControl.currentPage]).view;
    NSInteger currentPage = mlkPageControl.currentPage;

    if( mlkPageControl.currentPage == FIRST_PAGE || mlkPageControl.currentPage == LAST_PAGE )
    {
        pageRect = CGRectMake( (currentPage * CONTENT_VIEW_SPACING) + currentPage *  contentView.frame.size.width, contentScrollView.frame.origin.y , contentScrollView.frame.size.width, contentScrollView.frame.size.height);
    }
    else
    {
        pageRect = CGRectMake( (currentPage * CONTENT_VIEW_SPACING) + currentPage *  contentView.frame.size.width - CONTENT_VIEW_SPACING, contentScrollView.frame.origin.y , contentScrollView.frame.size.width, contentScrollView.frame.size.height);
    }

    [contentScrollView scrollRectToVisible:pageRect animated:YES];
}

関数- (IBAction)changeContentPage:(id)sender呼び出し時のサイズは 320*568 ですが、呼び出し時- (void)setupContentViewsのサイズは 600*600 です。

4

0 に答える 0