No se puede encontrar una fórmula matemática para cambiar el tamaño de dos vistas.

Estoy teniendo una position inicial como puedes ver en mi boceto. Mi map siempre llena toda la pantalla. Acabo de cambiar el tamaño de mi vista de tabla encima.

introduzca la descripción de la imagen aquí

Cuando hago clic en el map, la vista de tabla cambia de tamaño, como puedes ver en el dibujo de mis segundos, el de la izquierda. Si luego hago clic en la vista de tabla, se cambiará el tamaño de tableview.

introduzca la descripción de la imagen aquí

Ahora el problema es que no puedo encontrar una function matemática que las 2 cosas siempre tengan el mismo tamaño. Como señalo en el boceto.

Así cómo inicializo las 2 vistas:

-(void) initMapView { _mapView = [[GoogleMapViewController alloc] init]; [self addChildViewController:_mapView]; _mapView.view.frame = CGRectMake(0, 0, self.view.bounds.size.width , self.view.bounds.size.height); UILongPressGestureRecognizer * tapGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(expandMap:)]; [_mapView.view addGestureRecognizer:tapGesture]; [self.view addSubview:_mapView.view]; [_mapView didMoveToParentViewController:self]; } -(void) initPOITableView { _poiTableView = [[POITableViewController alloc] init]; [self addChildViewController:_poiTableView]; _poiTableView.view.frame = CGRectMake(0, self.view.bounds.size.height / 2, self.view.bounds.size.width, self.view.bounds.size.height); UILongPressGestureRecognizer * tapGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(expandTableView:)]; [_poiTableView.view addGestureRecognizer:tapGesture]; [self.view addSubview:_poiTableView.view]; [_poiTableView didMoveToParentViewController:self]; } 

Y esta es mi function de animation:

 - (void) expandTableView:(UITapGestureRecognizer *)sender { NSLog(@"ExpandTableView Animation"); NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:0]; float cellHeight = [_poiTableView getHeightForIndexPath:indexPath]; NSLog(@"Cell height %f", cellHeight ); float navBarHeight = self.navigationController.navigationBar.frame.size.height; [UIView animateWithDuration:1.0 delay:0.2 options:0 animations:^{ if(_isStartUpPosition) { NSLog(@"StartUp"); _poiTableView.view.frame = CGRectMake(_poiTableView.view.frame.origin.x, _poiTableView.view.frame.origin.y - ( _poiTableView.view.frame.origin.y - navBarHeight - 2 * cellHeight ), _poiTableView.view.frame.size.width, _poiTableView.view.frame.size.height); _isMapExpanded = NO; _isStartUpPosition = NO; } else if(_isMapExpanded) { NSLog(@"TableView is now being expanded"); _poiTableView.view.frame = CGRectMake(_poiTableView.view.frame.origin.x, _poiTableView.view.frame.origin.y - ( _poiTableView.view.frame.origin.y - navBarHeight - 2 * cellHeight ), _poiTableView.view.frame.size.width, _poiTableView.view.frame.size.height); _isMapExpanded = NO; } } completion:nil]; } - (void) expandMap:(UITapGestureRecognizer *)sender { NSLog(@"ExpandMap Animation"); NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:0]; float cellHeight = [_poiTableView getHeightForIndexPath:indexPath]; [UIView animateWithDuration:1.0 delay:0.2 options:0 animations:^{ if(_isStartUpPosition) { NSLog(@"StartUp"); _poiTableView.view.frame = CGRectMake(_poiTableView.view.frame.origin.x, _poiTableView.view.frame.origin.y + _poiTableView.view.frame.origin.y - cellHeight, _poiTableView.view.frame.size.width, _poiTableView.view.frame.size.height); _isMapExpanded = YES; _isStartUpPosition = NO; } else if(!_isMapExpanded) { NSLog(@"Map is now being expanded"); _poiTableView.view.frame = CGRectMake(_poiTableView.view.frame.origin.x, _poiTableView.view.frame.origin.y + 2 * _poiTableView.view.frame.origin.y , _poiTableView.view.frame.size.width, _poiTableView.view.frame.size.height); _isMapExpanded = YES; } } completion:nil]; } 

Simplemente no puedo encontrar la relación entre los dos, así que podrían ser siempre los mismos. En cada pantalla

EDITAR

Este es ahora mi map expandir

  if(!_isMapExpanded) { NSLog(@"Map is now being expanded"); _poiTableView.view.frame = CGRectMake(_poiTableView.view.frame.origin.x, _poiTableView.view.frame.origin.y, _poiTableView.view.frame.size.width, _shrankHeight); _isMapExpanded = YES; _mapView.view.frame = CGRectMake(_mapView.view.frame.origin.x, _mapView.view.frame.origin.y, _mapView.view.frame.size.width, _expandedHeight); } 

y esta es mi vista de tabla expandir:

  if(_isMapExpanded) { NSLog(@"TableView is now being expanded"); _poiTableView.view.frame = CGRectMake(_poiTableView.view.frame.origin.x, _poiTableView.view.frame.origin.y, _poiTableView.view.frame.size.width, _expandedHeight); _mapView.view.frame = CGRectMake(_mapView.view.frame.origin.x, _mapView.view.frame.origin.y, _mapView.view.frame.size.width, _shrankHeight); _isMapExpanded = NO; } 

Lo que tengo ahora es que, cuando mi tabla se expanda, solo va a la mitad de la pantalla y no a la parte superior.

 @property float shrankHeight; @property float expandedHeight; @property float normalHeight; - (void) calculateHeights { CGRect screenBounds = [[UIScreen mainScreen] bounds]; // If you're going to use landscape, use width. normalHeight = (screenBounds.height - 44) / 2.0; // Don't forget the navigation bar, though. shrankHeight = normalHeight / 3.0; expandedHeight = normalHeight * 5.0 / 3; } 

Después de haber calculado las alturas, puede usarlas en su bloque de animation.

Por ejemplo, si el map se va a expandir, debería:

 _poiTableView.view.frame = CGRectMake(_poiTableView.view.frame.origin.x, _poiTableView.view.frame.origin.y + 2 * _poiTableView.view.frame.origin.y , _poiTableView.view.frame.size.width, shrankHeight); 

Y

 _mapView.view.frame = CGRectMake(_mapView.view.frame.origin.x, _mapView.view.frame.origin.y + 2 * _mapView.view.frame.origin.y , _mapView.view.frame.size.width, expandedHeight); 

Probablemente necesitará cambiar sus centros después.