views:

525

answers:

1

In a class that conforms to UIApplicationDelegate and UIScrollViewDelegate I did the following in :

- (void)applicationDidFinishLaunching:(UIApplication *)application {


// Created an instance of UIScrollView to house a horizontal strip - along the x-axis - of kNumberOfPages UIViews:

    scrollView = [[UIScrollView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];


// Make self the delegate

    scrollView.delegate = self;


// Set content size to the cumulative width of all UIViews contained

    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height);


// Zoom range is from a min of the width of the scrollView to a max of 2 * scrollView.contentSize

    scrollView.minimumZoomScale =  scrollView.frame.size.width / scrollView.contentSize.width;
    scrollView.maximumZoomScale =  2 * scrollView.contentSize;


// A subclass of UIView will be the container for the horizontal strip of UIViews

    containerView = [[ConstrainedView alloc] initWithFrame:CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height)];


// The only difference betrween ConstrainedView and UIView is this overloaded method that constrains zooming to only the x-axis


- (void)setTransform:(CGAffineTransform)newValue {


    // Scale along the y-axis only
    CGAffineTransform constrainedTransform = CGAffineTransformScale(CGAffineTransformIdentity, newValue.a, 1.0);


     [super setTransform:constrainedTransform];


}


// Fill the container view with UIViews as subviews
CGFloat horizontalOffsetX = 0.0;
for (int i = 1; i <= kNumberOfPages; i++) {

    CGRect frame = CGRectMake(horizontalOffsetX, 0.0, scrollView.frame.size.width, scrollView.frame.size.height);
    UIView *v = [[[UIView alloc] initWithFrame:frame] autorelease];


// paint the background of each UIView a random color.

    v.backgroundColor = [UIColor colorWithRed:randomRed green:randomGreen blue:randomBlue alpha:1.0];
    [containerView addSubview:v];

    horizontalOffsetX += v.bounds.size.width;

} // for (kNumberOfPages)



// insert the container view as a subview of scrollView
    [scrollView addSubview:containerView];

    [window addSubview:scrollView];
    [window makeKeyAndVisible];

}

Looks pretty tame, right? Here's the weirdness. Zooming in - magnifying - works fine. However, as I zoom in there is increasing resistance, jitter, and increased slowness as if I'm dragging through hardening molasses as I attempt to approach fully zoomed out. It is almost impossible to squash the N UIViews so that they all appear within the bounds of the UIScrollView frames. Very weird.

Can someone please explain what is going on and if this is in fact a bug?

Cheers,

Doug

+1  A: 

UPDATE

My approach does appear to work with the following caveat. There appears to be a boundary condition issue here.

This works:

scrollView.minimumZoomScale = (scrollView.frame.size.width / scrollView.contentSize.width) / 0.99;

This hangs - crashes - the app:

scrollView.minimumZoomScale = scrollView.frame.size.width / scrollView.contentSize.width;

As long as the width of the scrollView exceeds to width of the content - regardless of differential zooming - the app appears to work just fine.

I can easily work around this minor limitation. Cool.

Cheers,

Doug

dugla