У меня есть 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 пикселей - что дает?