iphone ios uiscrollview ios6 autolayout

iphone - scrollview swift



Problema de descarga automática de UIScrollview (9)

Tengo un problema con autolayout (quizás) y mi scrollview!

Mi problema

  1. Me desplazo hacia abajo

2. Luego me empujo a otra vista

3.Entonces vuelvo y la vista de desplazamiento se ve así y no puedo desplazarme al punto más alto. (Lo veo en el rebote de la vista de desplazamiento)

Alguien puede ayudarme?


¿Has probado esto?

self.automaticallyAdjustsScrollViewInsets = NO;

En mi caso, esto fue lo que resolvió mi problema.


El problema es que ScrollView se configuró ContentOffset antes de aplicar AutoLayout. la solucion es:

Crear propiedad privada

@property (assign,nonatomic) CGPoint scrollviewContentOffsetChange;

Agregar código para ver el método

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.scrollView.contentOffset = CGPointZero; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; self.scrollviewContentOffsetChange = self.scrollView.contentOffset; } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; self.scrollView.contentOffset = self.scrollviewContentOffsetChange; }


El siguiente fragmento de código en el controlador de vista que contiene también parece resolver el problema, sin confiar en tamaños explícitos:

- (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; self.mainScrollView.contentOffset = CGPointZero; }

Restablece el offset de contenido al origen, pero parece que también lo hacen las otras respuestas.


Estaba usando la solución de Adam, pero comencé a tener problemas cuando salía con animated: YES. En mi código, la compensación de contenido se establece un tiempo después de la vista de MostrarAparece (ya que la visualización de Mostrar parece ser demasiado pronto).

- (void)viewDidDisappear:(BOOL)animated { self.scrollOffsetToPersist = self.scrollView.contentOffset; self.scrollView.contentOffset = CGPointZero; [super viewDidDisappear:animated]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[NSOperationQueue mainQueue] addOperationWithBlock:^ { self.scrollView.contentOffset = self.scrollOffsetToPersist; }]; }

EDITAR: otra forma mejor es restablecerlo en viewDidLayoutSubviews :)

- (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; if(!CGPointEqualToPoint(CGPointZero, self.scrollOffsetToPersist)) { self.scrollView.contentOffset = self.scrollOffsetToPersist; self.scrollOffsetToPersist = CGPointZero; } }


Esto no es genial, pero superé el diseño automático (definitivamente no de la manera correcta, pero estaba cansado de intentarlo) al establecer el tamaño del contenido en viewDidAppear después de que ocurriera el autodiseño, estableciendo scrollOffset y persistiendo el desplazamiento de desplazamiento en viewDidDisappear, y luego configurando el desplazamiento de desplazamiento vuelve a su estado persistente en viewDidAppear.

Me gusta esto:

-(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:YES]; self.scrollView.contentSize = self.scrollViewInnerView.frame.size; self.scrollView.contentOffset = [self.scrollOffsetToPersist CGPointValue]; } -(void)viewDidDisappear:(BOOL)animated{ [super viewDidDisappear:YES]; self.scrollOffsetToPersist = [NSValue valueWithCGPoint:self.scrollView.contentOffset]; self.scrollView.contentOffset = CGPointZero; }

No del todo elegante, pero funciona así que pensé que lo compartiría.


Si todavía estás buscando una respuesta, la encontré hoy después de dos días de golpear la pared. Simplemente te pegaré el código, pero lo más importante es cuando cargas tu scrollView ...

-(void)viewWillAppear:(BOOL)animated{ [scrollView setFrame:CGRectMake(0, 0, 320, 800)]; } -(void)viewDidAppear:(BOOL)animated { [scrollView setScrollEnabled:YES]; [scrollView setContentSize:CGSizeMake(320, 800)]; }

todo esto está cargado antes -(void)viewDidLoad

observe que la altura es en ambos casos 800, lo cual es crucial para resolver este problema. buena suerte con tu proyecto ;)


Utilizo un UITabBarController y diferentes vistas con diseño automático. Las vistas son más largas que la pantalla del dispositivo. Pasar de una pestaña a la otra conduce, a veces, al problema que describes. Esto solo ocurre si la vista se ha desplazado hacia abajo antes del cambio. Intenté todos los consejos aquí, pero esto no funcionó en mi caso. Mi solución fue volver a desplazarme hacia arriba antes de abandonar la vista. Al menos una solución para este error en iOS 6:

-(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [scrollView setContentOffset:CGPointZero animated:NO]; }


Yo tuve el mismo problema. Resultó que estaba limitando la vista de contenido al alinear el centro en y con el centro y de la supervista. Cuando eliminé esta restricción funcionó bien.


prueba esto

@property (nonatomic, assign) CGPoint scrollViewContentOffsetChange; - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.scrollView.contentOffset = CGPointZero; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; self.scrollViewContentOffsetChange = _scrollView.contentOffset; } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; _scrollView.contentOffset = self.scrollViewContentOffsetChange; }