Skip to content

Commit 4be9a50

Browse files
committed
fix(tabs): delay layout until tabs finish transitioning
1 parent d12ac66 commit 4be9a50

File tree

1 file changed

+28
-4
lines changed

1 file changed

+28
-4
lines changed

src/tabs/tabs.ios.ts

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class MDCTabBarViewDelegateImpl extends NSObject implements MDCTabBarViewDelegat
4141
const selectedIndex = owner.tabBarItems.indexOf(item);
4242

4343
if (owner.selectedIndex !== selectedIndex) {
44-
owner._canSelectItem = false;
44+
owner.beginTabTransition();
4545
}
4646

4747
const tabStrip = owner.tabStrip;
@@ -396,7 +396,7 @@ class UIPageViewControllerDelegateImpl extends NSObject implements UIPageViewCon
396396
// or it will create weird behaviors
397397
owner._animateNextChange = false;
398398
owner.selectedIndex = nextViewControllerIndex;
399-
owner._canSelectItem = true;
399+
owner.finishTabTransition();
400400
}
401401
// HACK: UIPageViewController fix; see https://stackoverflow.com/questions/15325891
402402
if (owner._needsCacheUpdate) {
@@ -502,6 +502,8 @@ export class Tabs extends TabsBase {
502502
private _rippleColor: Color;
503503
public iosCustomPositioning: boolean;
504504

505+
private _layoutPending = false;
506+
505507
constructor() {
506508
super();
507509

@@ -526,6 +528,26 @@ export class Tabs extends TabsBase {
526528
super.disposeNativeView();
527529
}
528530

531+
requestLayout() {
532+
if (!this._canSelectItem) {
533+
this._layoutPending = true;
534+
} else {
535+
this._layoutPending = false;
536+
super.requestLayout();
537+
}
538+
}
539+
540+
beginTabTransition() {
541+
this._canSelectItem = false;
542+
}
543+
544+
finishTabTransition() {
545+
this._canSelectItem = true;
546+
if (this._layoutPending) {
547+
this.requestLayout();
548+
}
549+
}
550+
529551
// TODO
530552
// @profile
531553
public onLoaded() {
@@ -781,7 +803,9 @@ export class Tabs extends TabsBase {
781803
this._needsCacheUpdate = true;
782804
super.onItemsChanged(oldItems, newItems);
783805
if (oldItems) {
784-
this._canSelectItem = true;
806+
if (!this._canSelectItem) {
807+
this.finishTabTransition();
808+
}
785809
this._setCanBeLoaded(this.selectedIndex);
786810
this._loadUnloadTabItems(this.selectedIndex);
787811
}
@@ -1175,7 +1199,7 @@ export class Tabs extends TabsBase {
11751199
const doneAnimating = () => {
11761200
this.visitFrames(item, (frame) => (frame._animationInProgress = false));
11771201

1178-
this._canSelectItem = true;
1202+
this.finishTabTransition();
11791203
this._setCanBeLoaded(value);
11801204
this._loadUnloadTabItems(value);
11811205
};

0 commit comments

Comments
 (0)