-
-
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
SafeArea
component 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!)