-
-
Save xiangyuan/408024518ed0dfa5db0e7895c0040ecc to your computer and use it in GitHub Desktop.
Restrict Unity UI to an iPhone X or other Mobile Device's Safe Area
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 to a "SafeAreaContainer" | |
/// child of that canvas, and then to lay out other 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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment