UIScrollView не показывает правильные расстояния - PullRequest
0 голосов
/ 22 апреля 2011

У меня есть UIScrollView, который я пытаюсь настроить с помощью подкачки.Очень просто - позаимствовал большую часть исходного кода из примера кода Scroller .Вот код для интерфейса контроллера, которому принадлежит представление прокрутки:

#import <UIKit/UIKit.h>

@interface BookViewController : UIViewController <UIScrollViewDelegate> {
    IBOutlet UIScrollView *pageScrollView;    
}

@property (nonatomic, retain) IBOutlet UIScrollView *pageScrollView;

@end

И реализация:

#import "BookViewController.h"

const CGFloat kScrollObjHeight  = 513.0;
const CGFloat kScrollObjWidth   = 1024.0;
const NSUInteger kNumImages     = 2;

@implementation BookViewController

@synthesize pageScrollView;

- (id)initWithNibName:(NSString *)nibNameOrNil 
               bundle:(NSBundle *)nibBundleOrNil
{
    return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}

- (void)dealloc
{
    [pageScrollView release];
    pageScrollView = nil;
    [super dealloc];    
}

- (void)layoutScrollImages
{
    UIView *view = nil;
    NSArray *subviews = pageScrollView.subviews;

    // Reposition all image subviews in a horizontal serial fashion
    CGFloat curXLoc = 0;
    int i = 1;
    for (view in subviews)
    {
        if ([view isKindOfClass:[UIView class]] && view.tag > 0)
        {
            CGRect frame = view.frame;
            frame.origin = CGPointMake(curXLoc, 0);
            view.frame = frame;

            curXLoc += (kScrollObjWidth);

            NSLog(@"layoutScrollImages: (%d) frame.size - %f x %f",
                  i, view.frame.size.width, view.frame.size.height);
            NSLog(@"layoutScrollImages: (%d) frame.origin - (%f, %f)", 
                  i, view.frame.origin.x, view.frame.origin.y);
            i++;
        }
    }

    // Set the content size so it can be scrollable.
    [pageScrollView setContentSize:CGSizeMake((kNumImages * kScrollObjWidth),
                                           pageScrollView.bounds.size.height)];
    NSLog(@"scrollView.contentSize - %f x %f", 
          pageScrollView.contentSize.width, pageScrollView.contentSize.height);
    NSLog(@"scrollView.frame.size - %f x %f", 
          pageScrollView.frame.size.width, pageScrollView.frame.size.height);
    NSLog(@"scrollView.bounds.size - %f x %f", 
          pageScrollView.bounds.size.width, pageScrollView.bounds.size.height);
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor viewFlipsideBackgroundColor];

    [pageScrollView setBackgroundColor:[UIColor blackColor]];
    [pageScrollView setCanCancelContentTouches:NO];
    pageScrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
    pageScrollView.clipsToBounds = YES;
    pageScrollView.scrollEnabled = YES;
    pageScrollView.pagingEnabled = YES;

    for (NSUInteger i = 1; i <= kNumImages; i++) {
        UIView *subview = [[UIView alloc] initWithFrame:pageScrollView.bounds];
        subview.tag = i;

        CGFloat r, g, b;
        r = (CGFloat)random() / INT32_MAX;
        g = (CGFloat)random() / INT32_MAX;
        b = (CGFloat)random() / INT32_MAX;

        subview.backgroundColor = [UIColor colorWithRed:r 
                                                  green:g 
                                                   blue:b 
                                                  alpha:1.0];

        NSLog(@"viewDidLoad: (%d) frame.size - %f x %f", 
              i, subview.frame.size.width, subview.frame.size.height);
        [pageScrollView addSubview:subview];
        [subview release];
    }

    [self layoutScrollImages];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    pageScrollView = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:
        (UIInterfaceOrientation)interfaceOrientation
{
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    NSLog(@"scrollViewDidEndDecelerating: contentOffset - (%f, %f)",
          scrollView.contentOffset.x, scrollView.contentOffset.y);
}

@end

Проблема заключается в том, что при прокрутке в этом представлении прокруткиРасстояние подкачки меньше ширины одного из этих подпредставлений.Другими словами, когда я «страница справа», я перелистываю одну целую страницу вправо, меньше примерно 40 пикселей.Вот (сокращенный) вывод этих NSLog() операторов:

viewDidLoad: (1) frame.size - 1024.000000 x 513.000000
viewDidLoad: (2) frame.size - 1024.000000 x 513.000000
layoutScrollImages: (1) frame.size - 1024.000000 x 513.000000
layoutScrollImages: (1) frame.origin - (0.000000, 0.000000)
layoutScrollImages: (2) frame.size - 1024.000000 x 513.000000
layoutScrollImages: (2) frame.origin - (1024.000000, 0.000000)
scrollView.contentSize - 2048.000000 x 513.000000
scrollView.frame.size - 1024.000000 x 513.000000
scrollView.bounds.size - 1024.000000 x 513.000000

Если я что-то не упустил, каждый из подпредставлений и представлений прокрутки frame имеет точно одинаковый размер, и прокруткаcontentSize вида имеет такую ​​же высоту, но в два раза шире.Что касается позиционирования, второй вид прокрутки смещен правильно.Чего мне не хватает?

РЕДАКТИРОВАТЬ: Я реализовал метод UIScrollViewDelegate,

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

Теперь вызов NSLog()в этом методе, после перелистывания влево / подкачки вправо на вторую страницу, получается следующее:

scrollViewDidEndDecelerating: contentOffset - (980.000000, 20.000000)

Итак, это подкачка на 44px от полной «страницы» (я перенесчто-то в моем первоначальном вопросе и сказал, что он слишком далеко прокручивается) и сдвигается вниз на 20 пикселей - что дает?

...