I am having problems using UIScrollView on IPhone while working with rotation. I used the Apple PageControl example as a model, but I create a scrollview myself in the view.
1) Scrollview works, as expected, when loading the default "Portrait", scrolling left and right horizontally
2) Out of the box, when the CW rotation and reinitialization basically turn it on its side, and now it turns vertically down, rather than horizontal. It seems that the width / height of the scroll frame does not change, but the orientation itself.
3) I tried to add some orientation detection logic to correctly sort and scroll the page depending on the orientation, which doesn’t work correctly, but only if I rotate the CCW into the landscape. If I go to CW, it starts on the right and scrolls left, and everything doesn't work.
Obviously, this is becoming hacky, so there is the right way to configure my UIScrollview and reinitialize it with rotations so that it always scrolls left and right?
- (void)loadView {
[self setupPage];
}
-(void) setupPage {
NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i = kNumberOfPages) return;
MyViewController *controller = [viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null]) {
controller = [[MyViewController alloc] initWithPageNumber:page];
[viewControllers replaceObjectAtIndex:page withObject:controller];
[controller release];
}
if (nil == controller.view.superview) {
CGRect frame = scrollView.frame;
int x = 0;
int y = 0;
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
if(orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight){
x = 0;
y = frame.size.height * page;
} else {
x = frame.size.width * page;
y = 0;
}
frame.origin.x = x;
frame.origin.y = y;
controller.view.frame = frame;
[scrollView addSubview:controller.view];
}
}
- (void)scrollViewDidScroll:(UIScrollView *)sender {
if (pageControlUsed) {
return;
}
CGFloat pageWidth = scrollView.frame.size.width;
int offset = 0;
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
if(orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight){
pageWidth = scrollView.frame.size.height;
offset = scrollView.contentOffset.y;
} else {
pageWidth = scrollView.frame.size.width;
offset = scrollView.contentOffset.x ;
}
int page = floor((offset - pageWidth / 2) / pageWidth) + 1;
pageControl.currentPage = page;
[self loadScrollViewWithPage:page - 1];
[self loadScrollViewWithPage:page];
[self loadScrollViewWithPage:page + 1];
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
pageControlUsed = NO;
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
pageControlUsed = NO;
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
[self setupPage];
}
source
share