修改RectTransform.pivot时UI位置会移动的问题(有小坑)
因为在脚本中直接改pivot会导致UI移位,就自己写了个方法,思路也很简单粗暴,就是计算距离然后把它拽回去,本以为不会出bug的...
而坑就是Unity会自作聪明地对于一些特殊的布局(比如拉伸至全屏状态时)进行自动修正,但一般的UI布局它又不修正...事实上,还有更细的一些判定条件……总之很坑……
观察后能看出Unity是只改了LocalPosition,最后修改代码如下:
// 改变一个RectTransform组件的pivot值,但是保持其实际位置不变 public static void ChangePivot(RectTransform rectTransform, float newPivotX, float newPivotY) { float originalPivotX = rectTransform.pivot.x; float originalPivotY = rectTransform.pivot.y; // 在某些特定布局下,Unity会在设置Pivot时自动调整LocalPosition以试图保持UI对象不被挪动,但这个“贴心”设定充满意外惊喜需要排除 Vector3 originalLocalPosition = rectTransform.localPosition; rectTransform.pivot = new Vector2(newPivotX, newPivotY); rectTransform.localPosition = originalLocalPosition; rectTransform.transform.position += new Vector3((newPivotX - originalPivotX) * rectTransform.rect.width, (newPivotY - originalPivotY) * rectTransform.rect.height, 0); }

浙公网安备 33010602011771号