-
-
Save SeanMcTex/c28f6e56b803cdda8ed7acb1b0db6f82 to your computer and use it in GitHub Desktop.
| using UnityEngine; | |
| /// <summary> | |
| /// Resizes a UI element with a RectTransform to respect the safe areas of the current device. | |
| /// This is particularly useful on an iPhone X, where we have to avoid the notch and the screen | |
| /// corners. | |
| /// | |
| /// The easiest way to use it is to create a root Canvas object, attach this script to a game object called "SafeAreaContainer" | |
| /// that is the child of the root canvas, and then layout the UI elements within the SafeAreaContainer, which | |
| /// will adjust size appropriately for the current device./// </summary> | |
| public class PinToSafeArea : MonoBehaviour { | |
| private Rect lastSafeArea; | |
| private RectTransform parentRectTransform; | |
| private void Start() { | |
| parentRectTransform = this.GetComponentInParent<RectTransform>(); | |
| } | |
| private void Update() { | |
| if ( lastSafeArea != Screen.safeArea ) { | |
| ApplySafeArea(); | |
| } | |
| } | |
| private void ApplySafeArea() { | |
| Rect safeAreaRect = Screen.safeArea; | |
| float scaleRatio = parentRectTransform.rect.width / Screen.width; | |
| var left = safeAreaRect.xMin * scaleRatio; | |
| var right = -( Screen.width - safeAreaRect.xMax ) * scaleRatio; | |
| var top = -safeAreaRect.yMin * scaleRatio; | |
| var bottom = ( Screen.height - safeAreaRect.yMax ) * scaleRatio; | |
| RectTransform rectTransform = GetComponent<RectTransform>(); | |
| rectTransform.offsetMin = new Vector2( left, bottom ); | |
| rectTransform.offsetMax = new Vector2( right, top ); | |
| lastSafeArea = Screen.safeArea; | |
| } | |
| } |
I think there is an error in your code and top is swapped with bottom. You're offsetting from top using yMin, which is offset from the bottom.
With the help of @Xaverix 's comment, I found that by doing a slight adjustment, the function works perfectly. Here's the fixed lines of code (line 33,34):
var top = -(Screen.height - safeAreaRect.yMax) * scaleRatio;
var bottom = safeAreaRect.yMin * scaleRatio;
2018 (when this was published) is now 5 years ago, crazy
Using it in 2024. Funny that unity doesn't have a SafeArea component after those years. Shame on you Unity!
Thanks!
Using it in 2024. Funny that unity doesn't have a
SafeAreacomponent after those years. Shame on you Unity! Thanks!
Haha! Glad it continues to be useful. :)
Thank you! Simple and just works
Sounds good to me! Done! Thanks for the suggestion. (And I'm glad you found it useful!)