- Home /
[SOLUTION] set UI RectTransform Anchor Presets from code c#
Example of usage solution:
_ImgTransform.SetAnchor(AnchorPresets.TopRight);
_ImgTransform.SetAnchor(AnchorPresets.TopRight,-10,-10);
ImgTransform.SetPivot(PivotPresets.TopRight);
Didn't test, but must to work ok:
using UnityEngine;
public enum AnchorPresets
{
TopLeft,
TopCenter,
TopRight,
MiddleLeft,
MiddleCenter,
MiddleRight,
BottomLeft,
BottonCenter,
BottomRight,
BottomStretch,
VertStretchLeft,
VertStretchRight,
VertStretchCenter,
HorStretchTop,
HorStretchMiddle,
HorStretchBottom,
StretchAll
}
public enum PivotPresets
{
TopLeft,
TopCenter,
TopRight,
MiddleLeft,
MiddleCenter,
MiddleRight,
BottomLeft,
BottomCenter,
BottomRight,
}
public static class RectTransformExtensions
{
public static void SetAnchor(this RectTransform source, AnchorPresets allign, int offsetX=0, int offsetY=0)
{
source.anchoredPosition = new Vector3(offsetX, offsetY, 0);
switch (allign)
{
case(AnchorPresets.TopLeft):
{
source.anchorMin = new Vector2(0, 1);
source.anchorMax = new Vector2(0, 1);
break;
}
case (AnchorPresets.TopCenter):
{
source.anchorMin = new Vector2(0.5f, 1);
source.anchorMax = new Vector2(0.5f, 1);
break;
}
case (AnchorPresets.TopRight):
{
source.anchorMin = new Vector2(1, 1);
source.anchorMax = new Vector2(1, 1);
break;
}
case (AnchorPresets.MiddleLeft):
{
source.anchorMin = new Vector2(0, 0.5f);
source.anchorMax = new Vector2(0, 0.5f);
break;
}
case (AnchorPresets.MiddleCenter):
{
source.anchorMin = new Vector2(0.5f, 0.5f);
source.anchorMax = new Vector2(0.5f, 0.5f);
break;
}
case (AnchorPresets.MiddleRight):
{
source.anchorMin = new Vector2(1, 0.5f);
source.anchorMax = new Vector2(1, 0.5f);
break;
}
case (AnchorPresets.BottomLeft):
{
source.anchorMin = new Vector2(0, 0);
source.anchorMax = new Vector2(0, 0);
break;
}
case (AnchorPresets.BottonCenter):
{
source.anchorMin = new Vector2(0.5f, 0);
source.anchorMax = new Vector2(0.5f,0);
break;
}
case (AnchorPresets.BottomRight):
{
source.anchorMin = new Vector2(1, 0);
source.anchorMax = new Vector2(1, 0);
break;
}
case (AnchorPresets.HorStretchTop):
{
source.anchorMin = new Vector2(0, 1);
source.anchorMax = new Vector2(1, 1);
break;
}
case (AnchorPresets.HorStretchMiddle):
{
source.anchorMin = new Vector2(0, 0.5f);
source.anchorMax = new Vector2(1, 0.5f);
break;
}
case (AnchorPresets.HorStretchBottom):
{
source.anchorMin = new Vector2(0, 0);
source.anchorMax = new Vector2(1, 0);
break;
}
case (AnchorPresets.VertStretchLeft):
{
source.anchorMin = new Vector2(0, 0);
source.anchorMax = new Vector2(0, 1);
break;
}
case (AnchorPresets.VertStretchCenter):
{
source.anchorMin = new Vector2(0.5f, 0);
source.anchorMax = new Vector2(0.5f, 1);
break;
}
case (AnchorPresets.VertStretchRight):
{
source.anchorMin = new Vector2(1, 0);
source.anchorMax = new Vector2(1, 1);
break;
}
case (AnchorPresets.StretchAll):
{
source.anchorMin = new Vector2(0, 0);
source.anchorMax = new Vector2(1, 1);
break;
}
}
}
public static void SetPivot(this RectTransform source, PivotPresets preset)
{
switch (preset)
{
case (PivotPresets.TopLeft):
{
source.pivot = new Vector2(0, 1);
break;
}
case (PivotPresets.TopCenter):
{
source.pivot = new Vector2(0.5f, 1);
break;
}
case (PivotPresets.TopRight):
{
source.pivot = new Vector2(1, 1);
break;
}
case (PivotPresets.MiddleLeft):
{
source.pivot = new Vector2(0, 0.5f);
break;
}
case (PivotPresets.MiddleCenter):
{
source.pivot = new Vector2(0.5f, 0.5f);
break;
}
case (PivotPresets.MiddleRight):
{
source.pivot = new Vector2(1, 0.5f);
break;
}
case (PivotPresets.BottomLeft):
{
source.pivot = new Vector2(0, 0);
break;
}
case (PivotPresets.BottomCenter):
{
source.pivot = new Vector2(0.5f, 0);
break;
}
case (PivotPresets.BottomRight):
{
source.pivot = new Vector2(1, 0);
break;
}
}
}
}
Thank you! AnchorPresets. BottomStretch
seems to be obsolete preset value, I guess it can be removed. Also no need in Vector3
when assigning anchored position, can do source.anchoredPosition = new Vector2(offsetX, offsetY);
ins$$anonymous$$d.
Works like charm. Started writing it from scratch and figured will check if someone has done it already and voila! It saved me an hour or two. Thanks for posting this.
Answer by Lund · Jun 19, 2019 at 11:25 AM
Thanks for it - it was pretty much what I was searching for. I rewrote it a little bit to use DoTween and make a smooth transition instead of instant jump to the new position since that was what I needed.
using DG.Tweening;
using UnityEngine;
public enum AnchorPresets
{
TopLeft,
TopCenter,
TopRight,
MiddleLeft,
MiddleCenter,
MiddleRight,
BottomLeft,
BottonCenter,
BottomRight,
BottomStretch,
VertStretchLeft,
VertStretchRight,
VertStretchCenter,
HorStretchTop,
HorStretchMiddle,
HorStretchBottom,
StretchAll
}
public enum PivotPresets
{
TopLeft,
TopCenter,
TopRight,
MiddleLeft,
MiddleCenter,
MiddleRight,
BottomLeft,
BottomCenter,
BottomRight,
}
public static class RectTransformExtensions
{
public static Tween SetAnchor(this RectTransform source, AnchorPresets allign, float offsetX = 0, float offsetY = 0, float duration = 1, Ease ease = Ease.OutCubic)
{
Vector2 anchorMin = Vector2.zero;
Vector2 anchorMax = Vector2.zero;
switch (allign)
{
case (AnchorPresets.TopLeft):
{
anchorMin = new Vector2(0, 1);
anchorMax = new Vector2(0, 1);
break;
}
case (AnchorPresets.TopCenter):
{
anchorMin = new Vector2(0.5f, 1);
anchorMax = new Vector2(0.5f, 1);
break;
}
case (AnchorPresets.TopRight):
{
anchorMin = new Vector2(1, 1);
anchorMax = new Vector2(1, 1);
break;
}
case (AnchorPresets.MiddleLeft):
{
anchorMin = new Vector2(0, 0.5f);
anchorMax = new Vector2(0, 0.5f);
break;
}
case (AnchorPresets.MiddleCenter):
{
anchorMin = new Vector2(0.5f, 0.5f);
anchorMax = new Vector2(0.5f, 0.5f);
break;
}
case (AnchorPresets.MiddleRight):
{
anchorMin = new Vector2(1, 0.5f);
anchorMax = new Vector2(1, 0.5f);
break;
}
case (AnchorPresets.BottomLeft):
{
anchorMin = new Vector2(0, 0);
anchorMax = new Vector2(0, 0);
break;
}
case (AnchorPresets.BottonCenter):
{
anchorMin = new Vector2(0.5f, 0);
anchorMax = new Vector2(0.5f, 0);
break;
}
case (AnchorPresets.BottomRight):
{
anchorMin = new Vector2(1, 0);
anchorMax = new Vector2(1, 0);
break;
}
case (AnchorPresets.HorStretchTop):
{
anchorMin = new Vector2(0, 1);
anchorMax = new Vector2(1, 1);
break;
}
case (AnchorPresets.HorStretchMiddle):
{
anchorMin = new Vector2(0, 0.5f);
anchorMax = new Vector2(1, 0.5f);
break;
}
case (AnchorPresets.HorStretchBottom):
{
anchorMin = new Vector2(0, 0);
anchorMax = new Vector2(1, 0);
break;
}
case (AnchorPresets.VertStretchLeft):
{
anchorMin = new Vector2(0, 0);
anchorMax = new Vector2(0, 1);
break;
}
case (AnchorPresets.VertStretchCenter):
{
anchorMin = new Vector2(0.5f, 0);
anchorMax = new Vector2(0.5f, 1);
break;
}
case (AnchorPresets.VertStretchRight):
{
anchorMin = new Vector2(1, 0);
anchorMax = new Vector2(1, 1);
break;
}
case (AnchorPresets.StretchAll):
{
anchorMin = new Vector2(0, 0);
anchorMax = new Vector2(1, 1);
break;
}
}
source.DOAnchorMin(anchorMin, duration).SetEase(ease);
source.DOAnchorMax(anchorMax, duration).SetEase(ease);
return source.DOAnchorPos(new Vector2(offsetX, offsetY), duration).SetEase(ease);
}
public static Tween SetPivot(this RectTransform source, PivotPresets preset, float duration = 1, Ease ease = Ease.OutCubic)
{
Vector2 pivotVector2 = Vector2.zero;
switch (preset)
{
case (PivotPresets.TopLeft):
{
pivotVector2 = new Vector2(0, 1);
break;
}
case (PivotPresets.TopCenter):
{
pivotVector2 = new Vector2(0.5f, 1);
break;
}
case (PivotPresets.TopRight):
{
pivotVector2 = new Vector2(1, 1);
break;
}
case (PivotPresets.MiddleLeft):
{
pivotVector2 = new Vector2(0, 0.5f);
break;
}
case (PivotPresets.MiddleCenter):
{
pivotVector2 = new Vector2(0.5f, 0.5f);
break;
}
case (PivotPresets.MiddleRight):
{
pivotVector2 = new Vector2(1, 0.5f);
break;
}
case (PivotPresets.BottomLeft):
{
pivotVector2 = new Vector2(0, 0);
break;
}
case (PivotPresets.BottomCenter):
{
pivotVector2 = new Vector2(0.5f, 0);
break;
}
case (PivotPresets.BottomRight):
{
pivotVector2 = new Vector2(1, 0);
break;
}
}
return source.DOPivot(pivotVector2, duration).SetEase(ease);
}
}
Wow, what a lot of code to write, do you not use tables? float[] table = new float[]{0,1,0,1,0.5,1,0.5,1,1,1,1,1 ...} int base = allign << 2; source.AnchorMin = new Vector2(table[base++], table[base++]); source.AnchorMax = new Vector2(table[base++], table[base]);
Oops, bad format, try again:
Wow, what a lot of code to write, do you not use tables?
float[] table = new float[]{0,1,0,1,0.5,1,0.5,1,1,1,1,1 ...}
int base = allign << 2;
source.AnchorMin = new Vector2(table[base++], table[base++]);
source.AnchorMax = new Vector2(table[base++], table[base]);