views:

51

answers:

1

How do I best position an image (UIImageView) within a UIScrollView programmatically?

I have the x and y coordinates (CGPoint C = centerCoordinate) of the image position that needs to be centered horizontally and vertically in the UIScrollView.

===Image=============================================
|                                                   |
|                                                   |
|              ==ScrollView===                      |
|              |             |                      |
|              |      C      |                      |
|              |             |                      |
|              ===============                      |
|                                                   |
|                                                   |
|                                                   |
|                                                   |
=====================================================

I tried a) working with the center property of the ImageView, but don't seem to make progress here. b) then I tried calculating the frame-property by setting the origin to

  C.x = -1 * centerCoordinate.x + ScrollView.frame.size.width / 2
  C.y = -1 * centerCoordinate.y + ScrollView.frame.size.width / 2

but don't succeed.

any hints?

regards

A: 

I think I found the way to do this. What threw me is how to take account of the zoomScale as well as factoring in the right frame coordinates since these change during zoom & scroll activities.

The solution that seems to work now is implemented in the UIScrollView and looks like this:

- (void) setViewPosition:(CGPoint) tapPoint zoomScale:(NSNumber *)zoomScale {
   ...
   self.zoomScale = zoomScale.floatValue;

   // Determine new center coordinate
   CGPoint mCOffset;
   mCOffset.x = tapPoint.x * self.zoomScale - frameSizeIvar.width  / 2;
   mCOffset.y = tapPoint.y * self.zoomScale - frameSizeIvar.height / 2;

   // Check whether center coordinate will place the map out of range
   // x-coordinate
   if ( mCOffset.x < 0 ) 
       mCOffset.x = 0;
   else if ( mCOffset.x > imageView.bounds.size.width * self.zoomScale - frameSizeIvar.width)
       mCOffset.x = imageView.bounds.size.width * self.zoomScale - frameSizeIvar.width;

   // y-coordinate
   if ( mCOffset.y < 0 ) 
      mCOffset.y = 0;
   else if ( mCOffset.y > iMapImageView.bounds.size.height * self.zoomScale - frameSizeIvar.height)
      mCOffset.y = iMapImageView.bounds.size.height * self.zoomScale - frameSizeIvar.height;

   self.contentOffset = mCOffset;
   ...
}
iFloh