react-native-navigation ios — поместить UIViewController в стек навигации

Я создаю навигационный стек, состоящий как из собственных представлений iOS, так и из реагирующих экранов. Но когда я нажимаю собственное представление iOS, макет представления не выходит так, как задумано в раскадровке. Я использую autolayout в Xcode для собственных представлений.

ICNativeViewManager.h
---------------------
#import <React/RCTViewManager.h>

@interface ICNativeViewManager : RCTViewManager

@end

ICNativeViewManager.m
---------------------
#import <React/RCTViewManager.h>
#import <React/RCTView.h>

#import "ICNativeViewManager.h"

@implementation ICNativeViewManager

UIViewController *vc;

RCT_EXPORT_MODULE()

-(UIView *)view
{
  if (vc == nil)
  {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"ICNativeUI" bundle:nil];
    vc = [storyboard instantiateInitialViewController];
  }
  return vc.view;
}

RCT_EXPORT_VIEW_PROPERTY(labelText, NSString)

@end

Дизайн в Xcode:

Просмотреть дизайн в раскадровке

Что показано в Симуляторе:

Вид, показанный в симуляторе


person ramg    schedule 28.07.2017    source источник


Ответы (2)


  1. Вы не должны кэшировать вывод метода -view, всегда возвращайте новое представление со всеми новыми зависимостями, например, контроллером представления.
  2. Вы должны использовать ограничения для макета вашего представления, поскольку ReactNative через процесс монтирования отправляет методы, которые изменяют кадр вашего представления. Без ограничений макет может быть нарушен.
  3. Для расчета кадра вашего представления React Native используйте YogaLayout (старый CSSLayout), убедитесь, что он вычисляет правильный размер вашего представления. Если не реализовать метод -shadowView ViewManager и вернуть экземпляр RCTShadowView с правильным значением свойства ширины и высоты.
person antonsergeev88    schedule 29.07.2017
comment
# 2 - раскадровка, из которой я загружаю контроллер представления, использует автоматическую компоновку. Итак, представление уже использует ограничения для компоновки. - person ramg; 31.07.2017
comment
#1 - Мне пришлось сохранить ссылку на контроллер представления. В противном случае он освобождается сразу после возврата метода view(), что предотвращает дальнейшее взаимодействие с представлением. - person ramg; 31.07.2017
comment
@ramg В вашем случае невозможно установить ограничения для супервизора, потому что супервизор (прототип для одного) не существует во время разработки. - person antonsergeev88; 31.07.2017
comment
Если вам нужен старый контроллер представления, вы должны создать новое представление и передать его старому контроллеру представления. Если вы вернете старый вид, в некоторых случаях реакция может привести к сбою приложения. - person antonsergeev88; 31.07.2017

Мне удалось исправить проблему макета, используя представление контейнера с ограничениями. У меня все еще есть проблема с получением обратных вызовов при нажатии кнопки.

-(UIView *)view
{
  UIView *parentView = [ICNativeView new];
  parentView.translatesAutoresizingMaskIntoConstraints = NO;
  UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"ICNativeUI" bundle:nil];
  self.viewController = [storyboard instantiateInitialViewController];
  UIView *nativeView = self.viewController.view;
  [parentView addSubview:nativeView];
  [parentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[nativeView]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(nativeView)]];
  [parentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[nativeView]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(nativeView)]];
  return parentView;
}

Макет исправлен

person ramg    schedule 31.07.2017