Fabric: Use padding instead of size for SafeAreaView

Summary:
Use padding instead of setting size of SafeAreaView, this should make it more consistent with Paper component.

changelog: [internal]

Reviewed By: shergin

Differential Revision: D18225793

fbshipit-source-id: 08dccbdae0e4f7a7847501a06e17d4c26473462a
This commit is contained in:
Samuel Susla 2019-10-31 21:23:43 -07:00 коммит произвёл Facebook Github Bot
Родитель cd1abb3bca
Коммит a82ebeb6f3
5 изменённых файлов: 26 добавлений и 40 удалений

Просмотреть файл

@ -13,27 +13,6 @@
using namespace facebook::react; using namespace facebook::react;
static UIScrollView *findScrollView(UIView *view, uint recursionDepth = 0)
{
if (recursionDepth >= 3) {
return NULL;
}
if ([view isKindOfClass:[UIScrollView class]]) {
return (UIScrollView *)view;
}
if (view.subviews.count >= 1) {
for (UIView *subview in view.subviews) {
UIScrollView *scrollView = findScrollView(subview.subviews.firstObject, recursionDepth + 1);
if (scrollView) {
return scrollView;
}
}
}
return NULL;
}
@implementation RCTSafeAreaViewComponentView { @implementation RCTSafeAreaViewComponentView {
SafeAreaViewShadowNode::ConcreteState::Shared _state; SafeAreaViewShadowNode::ConcreteState::Shared _state;
} }
@ -61,16 +40,14 @@ static UIScrollView *findScrollView(UIView *view, uint recursionDepth = 0)
- (void)layoutSubviews - (void)layoutSubviews
{ {
[super layoutSubviews]; [super layoutSubviews];
UIScrollView *scrollView = findScrollView(self); }
if (scrollView && CGSizeEqualToSize(scrollView.bounds.size, self.bounds.size)) {
[scrollView setContentInset:self._safeAreaInsets]; - (void)safeAreaInsetsDidChange
} else { {
if (_state != nullptr) { [super safeAreaInsetsDidChange];
CGSize size = self.bounds.size; if (_state != nullptr) {
size.height -= self._safeAreaInsets.bottom; auto newState = SafeAreaViewState{RCTEdgeInsetsFromUIEdgeInsets(self._safeAreaInsets)};
auto newState = SafeAreaViewState{RCTSizeFromCGSize(size)}; _state->updateState(std::move(newState));
_state->updateState(std::move(newState));
}
} }
} }

Просмотреть файл

@ -35,12 +35,7 @@ class SafeAreaViewComponentDescriptor final
shadowNode->getState()); shadowNode->getState());
auto stateData = state->getData(); auto stateData = state->getData();
if (stateData.safeAreaSize.width != 0 && layoutableShadowNode->setPadding(stateData.padding);
stateData.safeAreaSize.height != 0) {
layoutableShadowNode->setSize(
Size{stateData.safeAreaSize.width, stateData.safeAreaSize.height});
layoutableShadowNode->setPositionType(YGPositionTypeAbsolute);
}
ConcreteComponentDescriptor::adopt(shadowNode); ConcreteComponentDescriptor::adopt(shadowNode);
} }

Просмотреть файл

@ -19,10 +19,10 @@ class SafeAreaViewState final {
public: public:
using Shared = std::shared_ptr<const SafeAreaViewState>; using Shared = std::shared_ptr<const SafeAreaViewState>;
SafeAreaViewState(){}; SafeAreaViewState() = default;
SafeAreaViewState(Size screenSize_) : safeAreaSize(screenSize_){}; SafeAreaViewState(EdgeInsets padding_) : padding(padding_){};
const Size safeAreaSize{}; const EdgeInsets padding{};
#pragma mark - Getters #pragma mark - Getters
}; };

Просмотреть файл

@ -138,6 +138,18 @@ void YogaLayoutableShadowNode::setSize(Size size) const {
yogaNode_.setDirty(true); yogaNode_.setDirty(true);
} }
void YogaLayoutableShadowNode::setPadding(RectangleEdges<Float> padding) const {
ensureUnsealed();
auto style = yogaNode_.getStyle();
style.padding()[YGEdgeTop] = yogaStyleValueFromFloat(padding.top);
style.padding()[YGEdgeLeft] = yogaStyleValueFromFloat(padding.left);
style.padding()[YGEdgeRight] = yogaStyleValueFromFloat(padding.right);
style.padding()[YGEdgeBottom] = yogaStyleValueFromFloat(padding.bottom);
yogaNode_.setStyle(style);
yogaNode_.setDirty(true);
}
void YogaLayoutableShadowNode::setPositionType( void YogaLayoutableShadowNode::setPositionType(
YGPositionType positionType) const { YGPositionType positionType) const {
ensureUnsealed(); ensureUnsealed();

Просмотреть файл

@ -69,6 +69,8 @@ class YogaLayoutableShadowNode : public LayoutableShadowNode,
*/ */
void setSize(Size size) const; void setSize(Size size) const;
void setPadding(RectangleEdges<Float> padding) const;
/** /**
* Sets position type of Yoga node (relative, absolute). * Sets position type of Yoga node (relative, absolute).
*/ */