내 뷰를 만드는 데 스토리 보드를 사용하지 않기 때문에 프로그래밍 방식으로 “안전 영역 가이드 사용”옵션이 있는지 또는 그와 비슷한 것이 있는지 궁금합니다.
나는 내 견해를
view.safeAreaLayoutGuide
그러나 그들은 iPhone X 시뮬레이터의 최고 노치를 계속 겹칩니다.
답변
다음은 샘플 코드입니다 (참조 출처 : Safe Area Layout Guide ) :
코드에서 제약 조건을 생성하는 경우 UIView의 safeAreaLayoutGuide 속성을 사용하여 관련 레이아웃 앵커를 가져옵니다. 위의 인터페이스 빌더 예제를 코드로 다시 만들어서 어떻게 보이는지 살펴 보겠습니다.
뷰 컨트롤러의 속성으로 녹색 뷰가 있다고 가정합니다.
private let greenView = UIView()
viewDidLoad에서 호출되는 뷰와 제약 조건을 설정하는 함수가있을 수 있습니다.
private func setupView() {
greenView.translatesAutoresizingMaskIntoConstraints = false
greenView.backgroundColor = .green
view.addSubview(greenView)
}
항상 루트 뷰의 layoutMarginsGuide를 사용하여 선행 및 후행 여백 제약 조건을 만듭니다.
let margins = view.layoutMarginsGuide
NSLayoutConstraint.activate([
greenView.leadingAnchor.constraint(equalTo: margins.leadingAnchor),
greenView.trailingAnchor.constraint(equalTo: margins.trailingAnchor)
])
이제 iOS 11 이상을 대상으로하지 않는 한 안전 영역 레이아웃 가이드 제약 조건을 #available으로 래핑하고 이전 iOS 버전의 경우 상단 및 하단 레이아웃 가이드로 대체해야합니다.
if #available(iOS 11, *) {
let guide = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
greenView.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0),
guide.bottomAnchor.constraintEqualToSystemSpacingBelow(greenView.bottomAnchor, multiplier: 1.0)
])
} else {
let standardSpacing: CGFloat = 8.0
NSLayoutConstraint.activate([
greenView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: standardSpacing),
bottomLayoutGuide.topAnchor.constraint(equalTo: greenView.bottomAnchor, constant: standardSpacing)
])
}
결과:
다음은 안전 영역 레이아웃 가이드에 대한 Apple 개발자 공식 문서입니다.
iPhone-X의 사용자 인터페이스 디자인을 처리하려면 Safe Area가 필요합니다. 다음은 안전 영역 레이아웃을 사용하여 iPhone-X 용 사용자 인터페이스를 디자인하는 방법에 대한 기본 지침입니다.
답변
실제로 확장 프로그램을 사용하고 있으며 iOS 11인지 여부를 제어하고 있습니다.
extension UIView {
var safeTopAnchor: NSLayoutYAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.topAnchor
}
return self.topAnchor
}
var safeLeftAnchor: NSLayoutXAxisAnchor {
if #available(iOS 11.0, *){
return self.safeAreaLayoutGuide.leftAnchor
}
return self.leftAnchor
}
var safeRightAnchor: NSLayoutXAxisAnchor {
if #available(iOS 11.0, *){
return self.safeAreaLayoutGuide.rightAnchor
}
return self.rightAnchor
}
var safeBottomAnchor: NSLayoutYAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.bottomAnchor
}
return self.bottomAnchor
}
}
답변
SafeAreaLayoutGuide
인 UIView
속성은,
safeAreaLayoutGuide의 상단은 뷰의 가려지지 않은 상단 가장자리를 나타냅니다 (예 : 상태 표시 줄 또는 탐색 표시 줄 (있는 경우) 뒤가 아님). 다른 모서리도 비슷합니다.
safeAreaLayoutGuide
둥근 모서리, 탐색 모음, 탭 모음, 도구 모음 및 기타 조상보기에서 개체 클리핑 / 겹침을 방지하는 데 사용 합니다.
safeAreaLayoutGuide
객체 를 생성하고 객체 제약을 설정할 수 있습니다 .
세로 + 가로의 제약 조건은-
self.edgesForExtendedLayout = []//Optional our as per your view ladder
let newView = UIView()
newView.backgroundColor = .red
self.view.addSubview(newView)
newView.translatesAutoresizingMaskIntoConstraints = false
if #available(iOS 11.0, *) {
let guide = self.view.safeAreaLayoutGuide
newView.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true
newView.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true
newView.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true
newView.heightAnchor.constraint(equalToConstant: 100).isActive = true
}
else {
NSLayoutConstraint(item: newView, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1.0, constant: 0).isActive = true
NSLayoutConstraint(item: newView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true
NSLayoutConstraint(item: newView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true
newView.heightAnchor.constraint(equalToConstant: 100).isActive = true
}
답변
나처럼 SnapKit 을 사용하는 사람들에게 솔루션은 제약 조건을 다음 view.safeAreaLayoutGuide
과 같이 고정하는 것입니다.
yourView.snp.makeConstraints { (make) in
if #available(iOS 11.0, *) {
//Bottom guide
make.bottom.equalTo(view.safeAreaLayoutGuide.snp.bottomMargin)
//Top guide
make.top.equalTo(view.safeAreaLayoutGuide.snp.topMargin)
//Leading guide
make.leading.equalTo(view.safeAreaLayoutGuide.snp.leadingMargin)
//Trailing guide
make.trailing.equalTo(view.safeAreaLayoutGuide.snp.trailingMargin)
} else {
make.edges.equalToSuperview()
}
}
답변
layoutMarginsGuide에 선행 및 후행 여백 제약 조건을 추가하는 대신 이것을 사용하고 있습니다.
UILayoutGuide *safe = self.view.safeAreaLayoutGuide;
yourView.translatesAutoresizingMaskIntoConstraints = NO;
[NSLayoutConstraint activateConstraints:@[
[safe.trailingAnchor constraintEqualToAnchor:yourView.trailingAnchor],
[yourView.leadingAnchor constraintEqualToAnchor:safe.leadingAnchor],
[yourView.topAnchor constraintEqualToAnchor:safe.topAnchor],
[safe.bottomAnchor constraintEqualToAnchor:yourView.bottomAnchor]
]];
Krunal의 답변에서 ios 11의 하위 버전에 대한 옵션도 확인하십시오.
답변
사용 UIWindow
또는 UIView
의safeAreaInsets
.bottom
.top
.left
.right
// #available(iOS 11.0, *)
// height - UIApplication.shared.keyWindow!.safeAreaInsets.bottom
// On iPhoneX
// UIApplication.shared.keyWindow!.safeAreaInsets.top = 44
// UIApplication.shared.keyWindow!.safeAreaInsets.bottom = 34
// Other devices
// UIApplication.shared.keyWindow!.safeAreaInsets.top = 0
// UIApplication.shared.keyWindow!.safeAreaInsets.bottom = 0
// example
let window = UIApplication.shared.keyWindow!
let viewWidth = window.frame.size.width
let viewHeight = window.frame.size.height - window.safeAreaInsets.bottom
let viewFrame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
let aView = UIView(frame: viewFrame)
aView.backgroundColor = .red
view.addSubview(aView)
aView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
답변
시각적 형식에 제약 조건을 사용하면 무료로 안전 영역을 존중받을 수 있습니다.
class ViewController: UIViewController {
var greenView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
greenView.backgroundColor = .green
view.addSubview(greenView)
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
greenView.translatesAutoresizingMaskIntoConstraints = false
let views : [String:Any] = ["greenView":greenView]
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-[greenView]-|", options: [], metrics: nil, views: views))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-[greenView]-|", options: [], metrics: nil, views: views))
}
}