Files
5.24BuYu/Assets/Plugins/ImageCropper/Scripts/NotchCompensator.cs
T

80 lines
2.2 KiB
C#
Raw Normal View History

2026-04-13 18:30:55 +08:00
using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR
using Screen = UnityEngine.Device.Screen; // To support Device Simulator on Unity 2021.1+
#endif
namespace ImageCropperNamespace
{
public class NotchCompensator : MonoBehaviour
{
#if UNITY_EDITOR || UNITY_ANDROID || UNITY_IOS
[SerializeField]
[Tooltip( "If enabled, on Android and iOS devices with notch screens, top buttons will be repositioned so that the cutout(s) don't obscure them" )]
private bool avoidScreenCutout = true;
[SerializeField]
private RectTransform buttons;
[SerializeField]
private RectTransform viewport;
[SerializeField]
private Image notchBackground;
private RectTransform canvasTR;
private bool screenDimensionsChanged = true;
private void Awake()
{
canvasTR = (RectTransform) transform;
}
// Window is resized, update the list
private void OnRectTransformDimensionsChange()
{
screenDimensionsChanged = true;
}
private void LateUpdate()
{
if( screenDimensionsChanged )
{
CheckScreenCutout();
screenDimensionsChanged = false;
}
}
// If a cutout is intersecting with the buttons at the top on notch screens, shift these buttons downwards
private void CheckScreenCutout()
{
if( !avoidScreenCutout )
return;
// Check if there is a cutout at the top of the screen
int screenHeight = Screen.height;
float safeYMax = Screen.safeArea.yMax;
if( safeYMax < screenHeight - 1 ) // 1: a small threshold
{
// There is a cutout, shift the top buttons downwards
float cutoutPercentage = ( screenHeight - safeYMax ) / Screen.height;
float cutoutLocalSize = cutoutPercentage * canvasTR.rect.height;
buttons.anchoredPosition = new Vector2( 0f, -cutoutLocalSize );
viewport.sizeDelta = new Vector2( 0f, -cutoutLocalSize );
notchBackground.rectTransform.sizeDelta = new Vector2( 0f, cutoutLocalSize + 5f ); // 5f: to prevent a thin black line from appearing when canvas is scaled with screen size
if( !notchBackground.enabled )
notchBackground.enabled = true;
}
else
{
buttons.anchoredPosition = Vector2.zero;
viewport.sizeDelta = Vector2.zero;
if( notchBackground.enabled )
notchBackground.enabled = false;
}
}
#endif
}
}