objective-c iphone uiscrollview uiimageview fullscreen

objective-c - scrollview swift



¿Cómo centrar un UIImageView en un UIScrollView de pantalla completa? (5)

En mi aplicación, me gustaría presentar al usuario un visor de fotos en pantalla completa como el que se usa en la aplicación Fotos. Esto es solo para una foto y como tal debería ser bastante simple. Solo quiero que el usuario pueda ver esta foto con la capacidad de hacer zoom y paneo.

Tengo casi todo funcionando. Y, si no centro mi UIImageView, todo se comporta perfectamente. Sin embargo, realmente quiero que el UIImageView esté centrado en la pantalla cuando la imagen esté lo suficientemente alejada. No quiero que se pegue a la esquina superior izquierda de la vista de desplazamiento.

Una vez que intento centrar esta vista, mi área de desplazamiento vertical parece ser mayor de lo que debería ser. Como tal, una vez que me acerco un poco, puedo desplazar unos 100 píxeles más allá de la parte superior de la imagen. ¿Qué estoy haciendo mal?

@interface MyPhotoViewController : UIViewController <UIScrollViewDelegate> { UIImage* photo; UIImageView *imageView; } - (id)initWithPhoto:(UIImage *)aPhoto; @end @implementation MyPhotoViewController - (id)initWithPhoto:(UIImage *)aPhoto { if (self = [super init]) { photo = [aPhoto retain]; // Some 3.0 SDK code here to ensure this view has a full-screen // layout. } return self; } - (void)dealloc { [photo release]; [imageView release]; [super dealloc]; } - (void)loadView { // Set the main view of this UIViewController to be a UIScrollView. UIScrollView *scrollView = [[UIScrollView alloc] init]; [self setView:scrollView]; [scrollView release]; } - (void)viewDidLoad { [super viewDidLoad]; // Initialize the scroll view. CGSize photoSize = [photo size]; UIScrollView *scrollView = (UIScrollView *)[self view]; [scrollView setDelegate:self]; [scrollView setBackgroundColor:[UIColor blackColor]]; // Create the image view. We push the origin to (0, -44) to ensure // that this view displays behind the navigation bar. imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, -44.0, photoSize.width, photoSize.height)]; [imageView setImage:photo]; [scrollView addSubview:imageView]; // Configure zooming. CGSize screenSize = [[UIScreen mainScreen] bounds].size; CGFloat widthRatio = screenSize.width / photoSize.width; CGFloat heightRatio = screenSize.height / photoSize.height; CGFloat initialZoom = (widthRatio > heightRatio) ? heightRatio : widthRatio; [scrollView setMaximumZoomScale:3.0]; [scrollView setMinimumZoomScale:initialZoom]; [scrollView setZoomScale:initialZoom]; [scrollView setBouncesZoom:YES]; [scrollView setContentSize:CGSizeMake(photoSize.width * initialZoom, photoSize.height * initialZoom)]; // Center the photo. Again we push the center point up by 44 pixels // to account for the translucent navigation bar. CGPoint scrollCenter = [scrollView center]; [imageView setCenter:CGPointMake(scrollCenter.x, scrollCenter.y - 44.0)]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[[self navigationController] navigationBar] setBarStyle:UIBarStyleBlackTranslucent]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[[self navigationController] navigationBar] setBarStyle:UIBarStyleDefault]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; } - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return imageView; } @end



¿Has revisado las opciones de UIViewAutoresizing?

(De la documentación)

UIViewAutoresizing Specifies how a view is automatically resized. enum { UIViewAutoresizingNone = 0, UIViewAutoresizingFlexibleLeftMargin = 1 << 0, UIViewAutoresizingFlexibleWidth = 1 << 1, UIViewAutoresizingFlexibleRightMargin = 1 << 2, UIViewAutoresizingFlexibleTopMargin = 1 << 3, UIViewAutoresizingFlexibleHeight = 1 << 4, UIViewAutoresizingFlexibleBottomMargin = 1 << 5 }; typedef NSUInteger UIViewAutoresizing;


¿Pudiste resolver este problema? Estoy atascado con un problema similar. Creo que la razón detrás de esto es que zoomScale se aplica a todo el tamaño de contenido, independientemente del tamaño real de la subvista dentro de scrollView (en su caso, es un imageView). La altura de contentSize parece ser siempre igual o mayor que la altura del marco scrollView, pero nunca más pequeña. Por lo tanto, al aplicarle un zoom, la altura del contentSize se multiplica por el factor zoomScale, por eso está obteniendo 100 píxeles adicionales de desplazamiento vertical.


Este código debería funcionar en la mayoría de las versiones de iOS (y se ha probado que funciona en 3.1 hacia arriba).

Está basado en el código WWDC de Apple para PhotoScroller .

Agregue lo siguiente a su subclase de UIScrollView y reemplace tileContainerView con la vista que contiene su imagen o mosaicos:

- (void)layoutSubviews { [super layoutSubviews]; // center the image as it becomes smaller than the size of the screen CGSize boundsSize = self.bounds.size; CGRect frameToCenter = tileContainerView.frame; // center horizontally if (frameToCenter.size.width < boundsSize.width) frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2; else frameToCenter.origin.x = 0; // center vertically if (frameToCenter.size.height < boundsSize.height) frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2; else frameToCenter.origin.y = 0; tileContainerView.frame = frameToCenter; }


Probablemente desee establecer los límites de la vista de desplazamiento = límites de la vista de imagen y, a continuación, centrar la vista de desplazamiento en su vista que contiene. Si coloca una vista dentro de una vista de desplazamiento en un desplazamiento desde la parte superior, obtendrá ese espacio vacío encima de ella.