12
votes

How do I set the starting point of a UIScrollView? I would like to add a UIImageView left of the UIScrollView but changing the contentSize only adds scrolling room to the right of the scrollview. How do I add an ImageView left of the scrollView's (0,0) point and make it part of the scrollview's content size?

5
How did you solve that problem where you get extra space added onto right instead of being started from left? Like, the case you have mentioned where you start contentOffset from (-320,0) and increase the size by 320px. Ideally the extra space should be added to the left and not right. I too am facing exactly the same problem but the difference is that I am performing a vertical scroll. Please let me know how you could solve this problem?Raj Pawan Gumdal
I too have added a similar new question since there are no answers, please see if you can answer it: stackoverflow.com/questions/7648492/…Raj Pawan Gumdal

5 Answers

9
votes

Hopefully I've got what you're trying to do here. I think this just takes a few turns with the contentOffset to get right.

Starting off;

  • Add the scrollView at frame (0,0,320,480) - its a full screen scroller
  • set contentSize to (320*3, 480) - it now has a content with the width of 3 'pages'
  • Add your imageView as a subview to the scrollView at frame (320,0,320,480)
  • set contentOffset of the scrollView to (320, 0) - this will move the content of the scrollView left, in the negative x direction by 320
  • Now your imageView will be on screen, but it will have a 320px width both on the left and right on the scroller content.

(Note that in the code below, i've simply added a UIView and not an imageView)

UIScrollView *scroller = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
scroller.delegate = self;
scroller.pagingEnabled = YES;
scroller.backgroundColor = [UIColor blueColor];
scroller.contentSize = CGSizeMake(960, 480);

UIView *imgView = [[UIView alloc] initWithFrame:CGRectMake(320, 0, 320, 480)];
[imgView setBackgroundColor:[UIColor redColor]];
[scroller addSubview:imgView];

[scroller setContentOffset:CGPointMake(320, 0)];
[self.view addSubview:scroller];

Does that help?

3
votes

Actually the best solution to start in the middle of the scroller if you are in a iPhone you should

[scroller setContentOffset:CGPointMake(320, 0)];
[self.view addSubview:scroller];

And for iPad

[scroller setContentOffset:CGPointMake(1024, 0)];
[self.view addSubview:scroller];
1
votes

Try setting the Content offset.

[scrollView setContentOffset:CGPointMake(320, 0.0)];
0
votes

If you're simply looking to set where the scroller content should be positioned at the start, you could do so with the - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated method which will scroll the content to the point specified in the method.

Let me know if this is not what you wanted to know, and I'll get back to ya!

Cheers.

0
votes

The key to setting the starting point, is to assign bounds with xy coordinates different than zero. Like this

lazy var contentView: UIView = {
    let size = CGFloat(5000)
    let view = UIView(frame: CGRectZero)
    view.frame = CGRectMake(0, 0, size, size)
    view.bounds = CGRectMake(-size/2, -size/2, size, size)
    return view
}()

func centerContent() {
    let frame = UIEdgeInsetsInsetRect(self.scrollView.bounds, self.scrollView.contentInset)
    let navigationBarHeight = self.scrollView.contentInset.top
    let x = (self.scrollView.contentSize.width/2) - (frame.size.width/2)
    let y = (self.scrollView.contentSize.height/2) - (frame.size.height/2) - navigationBarHeight
    self.scrollView.contentOffset = CGPointMake(x, y)
}