Skip to content

Commit e79a483

Browse files
committed
fix(ios): correct view index of move operations in UIManager (#4443)
1 parent 4b69480 commit e79a483

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

renderer/native/ios/renderer/HippyUIManager.mm

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -985,32 +985,45 @@ - (void)renderMoveViews:(const std::vector<int32_t> &&)ids
985985
std::lock_guard<std::mutex> lock([self renderQueueLock]);
986986
HippyShadowView *fromShadowView = [_shadowViewRegistry componentForTag:@(fromContainer) onRootTag:@(rootTag)];
987987
HippyShadowView *toShadowView = [_shadowViewRegistry componentForTag:@(toContainer) onRootTag:@(rootTag)];
988+
std::vector<int32_t> moved_ids_render_idxs;
989+
moved_ids_render_idxs.reserve(ids.size());
990+
988991
for (int32_t hippyTag : ids) {
989992
HippyShadowView *view = [_shadowViewRegistry componentForTag:@(hippyTag) onRootTag:@(rootTag)];
990993
if (!view) {
991994
HippyLogWarn(@"Invalid Move, No ShadowView! (%d of %d)", hippyTag, rootTag);
992995
continue;
993996
}
997+
auto domNode = view.domNode.lock();
998+
if (!domNode) {
999+
HippyLogWarn(@"DomNode is null for view tag %d", hippyTag);
1000+
continue;
1001+
}
1002+
int32_t nodeRenderIndex = domNode->GetRenderInfo().index;
1003+
moved_ids_render_idxs.push_back(nodeRenderIndex);
1004+
9941005
HippyAssert(fromShadowView == [view parent], @"ShadowView(%d)'s parent should be %d", hippyTag, fromContainer);
9951006
[view removeFromHippySuperview];
996-
[toShadowView insertHippySubview:view atIndex:index];
1007+
[toShadowView insertHippySubview:view atIndex:nodeRenderIndex];
9971008
}
9981009
[fromShadowView dirtyPropagation:NativeRenderUpdateLifecycleLayoutDirtied];
9991010
[toShadowView dirtyPropagation:NativeRenderUpdateLifecycleLayoutDirtied];
10001011
[fromShadowView didUpdateHippySubviews];
10011012
[toShadowView didUpdateHippySubviews];
10021013
auto strongTags = std::move(ids);
1014+
10031015
[self addUIBlock:^(__unused HippyUIManager *uiManager, NSDictionary<NSNumber *,__kindof UIView *> *viewRegistry) {
10041016
UIView *fromView = [viewRegistry objectForKey:@(fromContainer)];
10051017
UIView *toView = [viewRegistry objectForKey:@(toContainer)];
1006-
for (int32_t tag : strongTags) {
1018+
for (int i = 0; i < strongTags.size(); i++) {
1019+
int32_t tag = strongTags[i];
10071020
UIView *view = [viewRegistry objectForKey:@(tag)];
10081021
if (!view) {
10091022
continue;
10101023
}
1011-
HippyAssert(fromView == [view parent], @"parent of object view with tag %d is not object view with tag %d", tag, fromContainer);
1024+
HippyAssert(fromView == [view parent], @"Parent of View(%d) should be %@(%d)!", tag, fromView, fromContainer);
10121025
[view removeFromHippySuperview];
1013-
[toView insertHippySubview:view atIndex:index];
1026+
[toView insertHippySubview:view atIndex:moved_ids_render_idxs[i]];
10141027
}
10151028
[fromView clearSortedSubviews];
10161029
[fromView didUpdateHippySubviews];

0 commit comments

Comments
 (0)