The Omni Group Forums

The Omni Group Forums (
-   Omni Frameworks (
-   -   How to work with OUIScalingScrollView (

Joe Alexander 2013-10-01 10:36 PM

How to work with OUIScalingScrollView
I'm trying to use the scaling scroll view, but am not sure how to set it up to do the right thing. I am setting everything up programmatically in a subclass of OUIScalingViewController. The following is the code I have written:

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.scrollView = [OUIScalingScrollView new];
self.scrollView.delegate = self;
self.scrollView.backgroundColor = [UIColor greenColor];
self.scrollView.translatesAutoresizingMaskIntoConstraints = NO;
self.scrollView.minimumZoomScale = 0.25f;
self.scrollView.maximumZoomScale = 5.0f;
[self.view addSubview:self.scrollView];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[sv]|" options:0 metrics:nil views:@{@"sv":self.scrollView}]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[sv]|" options:0 metrics:nil views:@{@"sv":self.scrollView}]];

self.mapView = [OUIScalingView new];
self.mapView.backgroundColor = [UIColor redColor];
self.mapView.translatesAutoresizingMaskIntoConstraints = NO;
[self.scrollView addSubview:self.mapView];
self.mapView.frame = CGRectMake(0.0f, 0.0f, 2000.0f, 4000.0f);
self.scrollView.contentSize = self.mapView.frame.size;

UILabel *label = [UILabel new];
label.translatesAutoresizingMaskIntoConstraints = YES;
label.text = @"This is a label.";
label.backgroundColor = [UIColor yellowColor];
[self.mapView addSubview:label];
label.frame = CGRectMake(50, 50, 100, 100);

label = [UILabel new];
label.translatesAutoresizingMaskIntoConstraints = YES;
label.text = @"This is a label.";
label.backgroundColor = [UIColor blueColor];
[self.mapView addSubview:label];
label.frame = CGRectMake(750, 750, 100, 100);

What happens is that when I pinch to zoom out, the whole thing gets zoomed out and says it's going to zoom to fit, and appears to do so at 26% size, but the labels don't scale with the view - well they do while you're pinching, but when you let go, they end up their original size. So the first question is how do I get the view and all its subviews to scale?

When I zoom in, the zoom factor goes up but when I let go, it snaps back to 72%. Why is that, and how do I fix it?

What I want to end up with is something a bit like OmniGraffle where the users can pinch to zoom the canvas, and it does what you expect. My program will resize the canvas as required, adding subviews to represent the different objects I want to draw. I will be able to calculate the canvas size and exact frames of all the graphic objects I want to display.

Joe Alexander 2013-10-02 01:52 AM

FYI, I took this same code and applied it to a standard UIScrollView, and it worked just fine (except that it didn't redraw my views on resize, but I seem to have fixed that by setting the content scale factor and setting it to need display).

Tim Wood 2013-10-03 07:33 AM

After the zooming operation is finished, the final scale factor applied by UIScrollView (via blurry/ugly pixel scaling) is accumulated into the inner OUIScalingView.scale property. The UIScrollView's scale is then set back to 100% so that no pixel blurring is done.

The accumulated scale gets used when drawing just that scaling view, via a transform set up either in its draw rect, or if you are using OUITiledScalingView, in the OUIScalingViewTile.

OmniGraffle uses OUITiledScalingView as the superclass of its main canvas view, in fact.

So, this all explains why the UILabels don't get scaled. By design the UIScrollView scale is set back to 100% to avoid blurring and the UILabel's don't get drawn under the influence of the scale factor in the OUIScalingView since their parent view can't force them to draw at a scale factor either (any attempt to do so would scale up the bitmap for their layer w/o making the layer bitmap bigger).

Joe Alexander 2013-10-08 01:24 AM

Cool, thanks Tim - lucky that I just happened to choose a UILabel to test with, so I now understand how it works... Will do some more experimentation.

BTW, thanks for OmniGraffle - it's a great inspiration showing what you can do on iPad.

All times are GMT -8. The time now is 06:40 PM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2021, vBulletin Solutions, Inc.