diff --git a/loader/include/Geode/cocos/base_nodes/Layout.hpp b/loader/include/Geode/cocos/base_nodes/Layout.hpp
index c1dcd908..c78cb76a 100644
--- a/loader/include/Geode/cocos/base_nodes/Layout.hpp
+++ b/loader/include/Geode/cocos/base_nodes/Layout.hpp
@@ -23,7 +23,9 @@ class CCNode;
  */
 class GEODE_DLL Layout : public CCObject {
 protected:
-    static CCArray* getNodesToPosition(CCNode* forNode);
+    CCArray* getNodesToPosition(CCNode* forNode);
+
+    bool m_ignoreInvisibleChildren = false;
 
 public:
     /**
@@ -35,6 +37,9 @@ public:
      */
     virtual void apply(CCNode* on) = 0;
 
+    void ignoreInvisibleChildren(bool ignore);
+    bool isIgnoreInvisibleChildren() const;
+
     virtual ~Layout() = default;
 };
 
diff --git a/loader/src/cocos2d-ext/Layout.cpp b/loader/src/cocos2d-ext/Layout.cpp
index d64fd437..efa61493 100644
--- a/loader/src/cocos2d-ext/Layout.cpp
+++ b/loader/src/cocos2d-ext/Layout.cpp
@@ -51,10 +51,21 @@ bool CCNode::hasAncestor(CCNode* ancestor) {
 }
 
 CCArray* Layout::getNodesToPosition(CCNode* on) {
-    if (!on->getChildren()) {
-        return CCArray::create();
+    auto arr = CCArray::create();
+    for (auto child : CCArrayExt<CCNode>(on->getChildren())) {
+        if (!m_ignoreInvisibleChildren || child->isVisible()) {
+            arr->addObject(child);
+        }
     }
-    return on->getChildren()->shallowCopy();
+    return arr;
+}
+
+void Layout::ignoreInvisibleChildren(bool ignore) {
+    m_ignoreInvisibleChildren = ignore;
+}
+
+bool Layout::isIgnoreInvisibleChildren() const {
+    return m_ignoreInvisibleChildren;
 }
 
 static AxisLayoutOptions const* axisOpts(CCNode* node) {