Fix UI pattern for AspectRatioLayoutElement.
This commit is contained in:
@@ -6,6 +6,7 @@ namespace Cryville.Common.Unity.UI {
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// A <see cref="ILayoutElement" /> that takes the length of one axis to compute the preferred length of the other axis with respect to a aspect ratio.
|
/// A <see cref="ILayoutElement" /> that takes the length of one axis to compute the preferred length of the other axis with respect to a aspect ratio.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[ExecuteAlways]
|
||||||
public class AspectRatioLayoutElement : UIBehaviour, ILayoutElement {
|
public class AspectRatioLayoutElement : UIBehaviour, ILayoutElement {
|
||||||
[SerializeField]
|
[SerializeField]
|
||||||
[Tooltip("The aspect ratio. Width divided by height.")]
|
[Tooltip("The aspect ratio. Width divided by height.")]
|
||||||
@@ -35,32 +36,27 @@ namespace Cryville.Common.Unity.UI {
|
|||||||
SetDirty();
|
SetDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetDirty() {
|
|
||||||
if (!IsActive()) return;
|
|
||||||
LayoutRebuilder.MarkLayoutForRebuild(transform as RectTransform);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public float minWidth {
|
public float minWidth {
|
||||||
get {
|
get {
|
||||||
return m_isVertical ? 0 : (transform as RectTransform).rect.height * m_aspectRatio;
|
return m_isVertical ? -1 : (transform as RectTransform).rect.height * m_aspectRatio;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public float preferredWidth { get { return minWidth; } }
|
public float preferredWidth { get { return minWidth; } }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public float flexibleWidth { get { return 0; } }
|
public float flexibleWidth { get { return -1; } }
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public float minHeight {
|
public float minHeight {
|
||||||
get {
|
get {
|
||||||
return m_isVertical ? (transform as RectTransform).rect.width / m_aspectRatio : 0;
|
return m_isVertical ? (transform as RectTransform).rect.width / m_aspectRatio : -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public float preferredHeight { get { return minHeight; } }
|
public float preferredHeight { get { return minHeight; } }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public float flexibleHeight { get { return 0; } }
|
public float flexibleHeight { get { return -1; } }
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public int layoutPriority { get { return 1; } }
|
public int layoutPriority { get { return 1; } }
|
||||||
@@ -71,34 +67,44 @@ namespace Cryville.Common.Unity.UI {
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void CalculateLayoutInputVertical() { }
|
public void CalculateLayoutInputVertical() { }
|
||||||
|
|
||||||
protected override void OnDidApplyAnimationProperties() {
|
|
||||||
base.OnDidApplyAnimationProperties();
|
|
||||||
SetDirty();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnDisable() {
|
|
||||||
SetDirty();
|
|
||||||
base.OnDisable();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnEnable() {
|
protected override void OnEnable() {
|
||||||
base.OnEnable();
|
base.OnEnable();
|
||||||
SetDirty();
|
SetDirty();
|
||||||
}
|
}
|
||||||
|
protected override void OnBeforeTransformParentChanged() {
|
||||||
protected override void OnRectTransformDimensionsChange() {
|
base.OnBeforeTransformParentChanged();
|
||||||
base.OnRectTransformDimensionsChange();
|
|
||||||
SetDirty();
|
SetDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnTransformParentChanged() {
|
protected override void OnTransformParentChanged() {
|
||||||
base.OnTransformParentChanged();
|
base.OnTransformParentChanged();
|
||||||
SetDirty();
|
SetDirty();
|
||||||
}
|
}
|
||||||
|
protected override void OnDidApplyAnimationProperties() {
|
||||||
// Overriding fails compiler
|
base.OnDidApplyAnimationProperties();
|
||||||
new void OnValidate() {
|
|
||||||
SetDirty();
|
SetDirty();
|
||||||
}
|
}
|
||||||
|
protected override void OnValidate() {
|
||||||
|
base.OnValidate();
|
||||||
|
SetDirty();
|
||||||
|
}
|
||||||
|
protected override void OnDisable() {
|
||||||
|
SetDirty();
|
||||||
|
base.OnDisable();
|
||||||
|
}
|
||||||
|
protected override void OnRectTransformDimensionsChange() {
|
||||||
|
base.OnRectTransformDimensionsChange();
|
||||||
|
SetDirty();
|
||||||
|
}
|
||||||
|
bool _delayedSetDirty;
|
||||||
|
private void SetDirty() {
|
||||||
|
if (!IsActive()) return;
|
||||||
|
if (CanvasUpdateRegistry.IsRebuildingLayout()) _delayedSetDirty = true;
|
||||||
|
else LayoutRebuilder.MarkLayoutForRebuild(transform as RectTransform);
|
||||||
|
}
|
||||||
|
void Update() {
|
||||||
|
if (!_delayedSetDirty) return;
|
||||||
|
_delayedSetDirty = false;
|
||||||
|
LayoutRebuilder.MarkLayoutForRebuild(transform as RectTransform);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user