iOs: inserta uiview en otra vista en código, mantén restricciones

Lo que estoy tratando de lograr. Siempre que tengo un UIViewController que henetworkinga de mi class SuperViewController, en viewDidLoad de mi controller de supervisión, tomo todas las sub-vistas de mi UIViewController, creo un UIScrollView, agrego todas las subvenciones y configuro este UIScrollView como el único hijo de UIViewController.

Estructura UIViewController antes de llamar [super viewDidLoad];

UIViewController UIView subview1 subview2 subview3 

después

 UIViewController UIView UIScrollView subview1 subview2 subview3 

con las restricciones que conciernen a UIView: sublicencias, se trasladó a sublicencias de UIScrollView

La razón por la que estoy haciendo esto es porque en nuestra aplicación tenemos mucho que hacer con scrollViews y solo quiero escribir el código para agregarlos una vez en la superclass y hacer que se active / desactive el desplazamiento en function del tamaño del contenido.

Lo que tengo actualmente en mi superviewController (simplificado)

  - (void)viewDidLoad { [super viewDidLoad]; if([self class]!=[SuperViewController class] && [self isKindOfClass:[SuperViewController class]]) { //subclass called this method UIScrollView *scrollViewToAdd = [[UIScrollView alloc] init]; UIView *originalView = self.view; NSArray* savedConstraints = self.view.constraints; for (UIView* view in self.view.subviews) { [scrollViewToAdd addSubview:view]; } for (NSLayoutConstraint*oldConstr in savedConstraints) { //loop through all of the constraints associated with the UIView. If one of the items is UIView, replace it with UIScrollView //add all of these constraints to UIScrollView NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:oldConstr.firstItem==self.view?scrollViewToAdd:oldConstr.firstItem attribute:oldConstr.firstAttribute relatedBy:oldConstr.relation toItem:oldConstr.secondItem==self.view?scrollViewToAdd:oldConstr.secondItem attribute:oldConstr.secondAttribute multiplier:oldConstr.multiplier constant:oldConstr.constant]; newConstraint.priority = oldConstr.priority; [scrollViewToAdd addConstraint:newConstraint]; } } //moving the subviews sets self.view to nil, thankfully i kept a reference so i can set it to the original value _scrollView = scrollViewToAdd; self.view = originalView; //add scrollview as a child [self.view addSubview:_scrollView]; //add scrollView constraints id topGuide =self.topLayoutGuide; id bottomGuide = self.bottomLayoutGuide; _scrollViewToTop = [[NSLayoutConstraint constraintsWithVisualFormat: @"V: [topGuide]-0-[_scrollView]" options: 0 metrics: nil views: NSDictionaryOfVariableBindings (topGuide, _scrollView )] firstObject]; _scrollViewToBottom = [[NSLayoutConstraint constraintsWithVisualFormat: @"V:[_scrollView]-0-[bottomGuide]" options: 0 metrics: nil views: NSDictionaryOfVariableBindings (bottomGuide, _scrollView)] firstObject]; [self.view addConstraint:_scrollViewToTop]; [self.view addConstraint:_scrollViewToBottom]; } 

Esto me da conflictos de restricción que no entiendo

  ( "<_UILayoutSupportConstraint:0xb866db0 V:[_UILayoutGuide:0xf9b2750(0)]>", "<_UILayoutSupportConstraint:0xb866cf0 V:|-(0)-[_UILayoutGuide:0xf9b2750] (Names: '|':UIView:0x9e90480 )>", "<_UILayoutSupportConstraint:0xb866f90 V:[_UILayoutGuide:0xb862070(0)]>", "<_UILayoutSupportConstraint:0xb866ec0 _UILayoutGuide:0xb862070.bottom == UIView:0x9e90480.bottom>", "<NSLayoutConstraint:0xb87a710 V:[_UILayoutGuide:0xf9b2750]-(0)-[UIScrollView:0x9e84b00]>", "<NSLayoutConstraint:0xb861e80 V:[UIScrollView:0x9e84b00]-(0)-[_UILayoutGuide:0xb862070]>", "<NSAutoresizingMaskLayoutConstraint:0xf9a5280 h=--& v=--& UIScrollView:0x9e84b00.midY ==>", "<NSAutoresizingMaskLayoutConstraint:0xf992950 h=-&- v=-&- UIView:0x9e90480.height == UIViewControllerWrapperView:0xb87bd20.height - 64>", "<NSAutoresizingMaskLayoutConstraint:0xb870f90 h=-&- v=-&- UIViewControllerWrapperView:0xb87bd20.height == UINavigationTransitionView:0x9a6e3e0.height>", "<NSAutoresizingMaskLayoutConstraint:0xf9b3560 h=-&- v=-&- UINavigationTransitionView:0x9a6e3e0.height == UILayoutContainerView:0x9a6dd10.height>", "<NSLayoutConstraint:0xb876390 'UIView-Encapsulated-Layout-Height' V:[UILayoutContainerView:0x9a6dd10(480)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0xb861e80 V:[UIScrollView:0x9e84b00]-(0)-[_UILayoutGuide:0xb862070]> 

Soy capaz de eliminar este conflicto si en lugar de

  self.view = originalView; [self.view addSubview:_scrollView]; 

hago

  [self.view = _scrollView]; 

pero eso no da como resultado la jerarquía de vista que quiero.

  1. Si necesita cargar ScrollView como Root View para ViewController, necesita anular el método loadView sin llamada super como este:

    – (void) loadView {_scrollView = [[UIScrollView alloc] initWithFrame: CGRectZero]; [self setView: self.scrollView]; }

  2. Las restricciones no funcionaron con AutoresizeMask. Si agrega restricciones para ver, esta vista se necesitará establecer [view setAutoresizingMask:NO]; o te atrapa el conflicto.

  3. Agregue subvistas antes de las restricciones de configuration.