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;
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 {
SafeAreaViewShadowNode::ConcreteState::Shared _state;
}
@ -61,16 +40,14 @@ static UIScrollView *findScrollView(UIView *view, uint recursionDepth = 0)
- (void)layoutSubviews
{
[super layoutSubviews];
UIScrollView *scrollView = findScrollView(self);
if (scrollView && CGSizeEqualToSize(scrollView.bounds.size, self.bounds.size)) {
[scrollView setContentInset:self._safeAreaInsets];
} else {
if (_state != nullptr) {
CGSize size = self.bounds.size;
size.height -= self._safeAreaInsets.bottom;
auto newState = SafeAreaViewState{RCTSizeFromCGSize(size)};
_state->updateState(std::move(newState));
}
}
- (void)safeAreaInsetsDidChange
{
[super safeAreaInsetsDidChange];
if (_state != nullptr) {
auto newState = SafeAreaViewState{RCTEdgeInsetsFromUIEdgeInsets(self._safeAreaInsets)};
_state->updateState(std::move(newState));
}
}

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

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

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

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

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

@ -138,6 +138,18 @@ void YogaLayoutableShadowNode::setSize(Size size) const {
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(
YGPositionType positionType) const {
ensureUnsealed();

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

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