Fix UI pattern for AspectRatioLayoutElement
.
This commit is contained in:
@@ -6,6 +6,7 @@ namespace Cryville.Common.Unity.UI {
|
||||
/// <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.
|
||||
/// </summary>
|
||||
[ExecuteAlways]
|
||||
public class AspectRatioLayoutElement : UIBehaviour, ILayoutElement {
|
||||
[SerializeField]
|
||||
[Tooltip("The aspect ratio. Width divided by height.")]
|
||||
@@ -35,32 +36,27 @@ namespace Cryville.Common.Unity.UI {
|
||||
SetDirty();
|
||||
}
|
||||
|
||||
private void SetDirty() {
|
||||
if (!IsActive()) return;
|
||||
LayoutRebuilder.MarkLayoutForRebuild(transform as RectTransform);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public float minWidth {
|
||||
get {
|
||||
return m_isVertical ? 0 : (transform as RectTransform).rect.height * m_aspectRatio;
|
||||
return m_isVertical ? -1 : (transform as RectTransform).rect.height * m_aspectRatio;
|
||||
}
|
||||
}
|
||||
/// <inheritdoc />
|
||||
public float preferredWidth { get { return minWidth; } }
|
||||
/// <inheritdoc />
|
||||
public float flexibleWidth { get { return 0; } }
|
||||
public float flexibleWidth { get { return -1; } }
|
||||
|
||||
/// <inheritdoc />
|
||||
public float minHeight {
|
||||
get {
|
||||
return m_isVertical ? (transform as RectTransform).rect.width / m_aspectRatio : 0;
|
||||
return m_isVertical ? (transform as RectTransform).rect.width / m_aspectRatio : -1;
|
||||
}
|
||||
}
|
||||
/// <inheritdoc />
|
||||
public float preferredHeight { get { return minHeight; } }
|
||||
/// <inheritdoc />
|
||||
public float flexibleHeight { get { return 0; } }
|
||||
public float flexibleHeight { get { return -1; } }
|
||||
|
||||
/// <inheritdoc />
|
||||
public int layoutPriority { get { return 1; } }
|
||||
@@ -71,34 +67,44 @@ namespace Cryville.Common.Unity.UI {
|
||||
/// <inheritdoc />
|
||||
public void CalculateLayoutInputVertical() { }
|
||||
|
||||
protected override void OnDidApplyAnimationProperties() {
|
||||
base.OnDidApplyAnimationProperties();
|
||||
SetDirty();
|
||||
}
|
||||
|
||||
protected override void OnDisable() {
|
||||
SetDirty();
|
||||
base.OnDisable();
|
||||
}
|
||||
|
||||
protected override void OnEnable() {
|
||||
base.OnEnable();
|
||||
SetDirty();
|
||||
}
|
||||
|
||||
protected override void OnRectTransformDimensionsChange() {
|
||||
base.OnRectTransformDimensionsChange();
|
||||
protected override void OnBeforeTransformParentChanged() {
|
||||
base.OnBeforeTransformParentChanged();
|
||||
SetDirty();
|
||||
}
|
||||
|
||||
protected override void OnTransformParentChanged() {
|
||||
base.OnTransformParentChanged();
|
||||
SetDirty();
|
||||
}
|
||||
|
||||
// Overriding fails compiler
|
||||
new void OnValidate() {
|
||||
protected override void OnDidApplyAnimationProperties() {
|
||||
base.OnDidApplyAnimationProperties();
|
||||
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