프로그래밍 방식으로 탐색 모음 높이 가져오기
뷰가 높은 컨트롤러(네비게이션 바)가 있으면 UIView가 높이만큼 내려갑니다.x라라 = 44px로 하다이 계속 도 알게 되었습니다.[self.view].frame.origin.y = 0.
이 네비게이션 바의 높이를 정수로 설정하는 것 외에 어떻게 결정하면 좋을까요?
또는 단축 버전에서는 UIView가 위에 네비게이션바에 표시되어 있는지 확인하려면 어떻게 해야 합니까?
전구가 켜지기 시작했어요.유감스럽게도, 아래 설명과 같이 문제를 해결하는 통일된 방법을 찾지 못했습니다.
내 모든 문제는 마스크의 자동 크기 조정에 집중되어 있다고 생각합니다.그 이유는 UI Web View의 유무에 관계없이 동일한 증상이 존재하기 때문입니다.그리고 그 증상은 초상화에 대한 모든 것이 순조롭다는 것이다.가로 세로에서는 맨 아래 UIButton이 TabBar 뒤에 팝업 표시됩니다.
예를 들어, 한 UIView에서는 위에서 아래로 다음과 같은 기능이 있습니다.
UIView – 양쪽 스프링 세트(기본 케이스)로 스트럿 없음
UIScroll View - 2개의 스프링을 설정하고 다른 모든 것(UIView 등)을 클리어하면 UIButton이 바로 위의 오브젝트에 침입합니다.모든 것을 클리어하면, UIButton은 OK입니다만, 맨 위에 있는 것은 Status Bar Setting의 맨 위 스트럿 뒤에 숨어 있기 때문에, UIButton은 Tab Bar 뒤에 팝업 되어 버립니다.
UILabel과 UIImage는 다음 단계입니다.톱 스트럿 세트, 다른 곳에서도 유연합니다.
UI Web View를 사용하는 소수의 그림을 완성합니다.
UI Web View - Struts :상단, 좌측, 우측 스프링 : 양쪽
UIButton – 아무것도 설정되어 있지 않다.즉, 어디에서나 유연성이 있다.
내 전구는 어둡지만 희망은 있어 보인다.
짧은 회신을 할 수 있는 여지가 필요했으므로 조금만 기다려 주십시오.
내가 정말 무엇을 낚고 있는지 이해하려고 애써줘서 고마워... 자, 이제 시작이야.
1) 각 UIView Controller(TabBar 앱)에는 UIImage, 텍스트 등이 있습니다.또 다른 공통분모는 하단에 있는 UIButton입니다.일부 UIView 컨트롤러에서는 UI Web View가 UIButton 위에 있습니다.
그래서, UIIMage, text 등UI Web View (일부) UIButton
위의 모든 것은 UIScroll View입니다.
2) UI Web View 를 사용하고 있는 유저의 경우, 그 autoresize Mask 는 다음과 같습니다.
—
|
—
^
|
|
|-- ← - ← || || V UIButton 마스크에는 아무것도 설정되어 있지 않습니다.즉, 어디에서나 유연합니다.
my - viewDidLoad 내에서 my - repositionSubViews를 호출하고 여기서 다음을 수행합니다.
UI Web View가 없는 경우 IB에서 배치한 UIButton을 센터링하는 것 이외에는 아무것도 하지 않습니다.
UI Web View가 있는 경우 해당 *콘텐츠*를 확인합니다.전체 컨텐츠를 둘러싸도록 프레임의 높이를 설정하고 설정합니다.
UIScrollView *scrollViewInsideWebView = [[webView_ subviews] lastObject];
webViewContentHeight = scrollViewInsideWebView.contentSize.height;
[webView_ setFrame:CGRectMake(webViewOriginX, webViewOriginY,
sameWholeViewScrollerWidth, webViewContentHeight)]
이렇게 하면 UIButton이 UI WebView 아래에 위치하도록 프로그래밍 방식으로 밀어넣습니다.
세로에서 가로로 회전하기 전까지는 모든 것이 작동한다.
-didRotateFrom 내에서 -repositionSubViews를 호출합니다.인터페이스 오리엔테이션
UI Web View의 콘텐츠 높이가 회전해도 변경되지 않는 이유는 무엇입니까?
세로 방향에서 가로 방향으로 콘텐츠 폭이 확대되고 콘텐츠 높이가 축소됩니다.시각적으로는 정상이지만, 제 NSLog에 따르면 그렇지 않습니다.
어쨌든 UI Web View의 유무에 관계없이, 지금까지 말한 버튼은 가로 모드일 때 TabBar 아래로 이동하지만, 위로 스크롤 되어 표시되지 않습니다."힘차게" 스크롤하면 Tabbar 뒤에 표시되지만, Tabbar 뒤에 "뒤로" 떨어집니다.
마지막으로 TabBar와 Navigation Bar의 높이에 대해 물어본 이유는 TabBar가 UIView의 하단에 스스로 심어져 있고, Navigation Bar가 UIView를 아래로 밀기 때문입니다.
이제 여기에 몇 가지 설명을 덧붙이겠습니다.왜냐하면 아까는 말이 안 되기 때문입니다.
UI Web View가 없는 경우 IB에서 보는 모든 것을 그대로 둡니다.
UI Web View에서는 UI Web View의 프레임을 늘립니다.내용물의 최고치모든 서브뷰를 둘러싸는 주위의 UIScrollView의 높이와 높이를 위쪽으로 조정합니다.
자, 여기 있네요.
이런 거 해?
NSLog(@"Navframe Height=%f",
self.navigationController.navigationBar.frame.size.height);
swift 버전은 여기에 있습니다.
갱신하다
iOS 13
statusBarFrame되었습니다.iOS13을 사용하다
extension UIViewController {
/**
* Height of status bar + navigation bar (if navigation bar exist)
*/
var topbarHeight: CGFloat {
return (view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0.0) +
(self.navigationController?.navigationBar.frame.height ?? 0.0)
}
}
iPhone-X에서는 상단 바(네비게이션 바+상태 바)의 높이를 변경(증가)합니다.
상단 바(네비게이션 바+상태 바 모두)의 정확한 높이를 원하는 경우 다음을 수행하십시오.
갱신하다
iOS 13
처럼statusBarFrame에서 폐지되었다.iOS13다음을 사용할 수 있습니다.
extension UIViewController {
/**
* Height of status bar + navigation bar (if navigation bar exist)
*/
var topbarHeight: CGFloat {
return (view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0.0) +
(self.navigationController?.navigationBar.frame.height ?? 0.0)
}
}
목표-C
CGFloat topbarHeight = ([UIApplication sharedApplication].statusBarFrame.size.height +
(self.navigationController.navigationBar.frame.size.height ?: 0.0));
스위프트 4
let topBarHeight = UIApplication.shared.statusBarFrame.size.height +
(self.navigationController?.navigationBar.frame.height ?? 0.0)
쉽게 하기 위해 이 UIView Controller 확장을 사용해 보십시오.
extension UIViewController {
/**
* Height of status bar + navigation bar (if navigation bar exist)
*/
var topbarHeight: CGFloat {
return UIApplication.shared.statusBarFrame.size.height +
(self.navigationController?.navigationBar.frame.height ?? 0.0)
}
}
스위프트 3
let topBarHeight = UIApplication.sharedApplication().statusBarFrame.size.height +
(self.navigationController?.navigationBar.frame.height ?? 0.0)
Swift 버전:
let navigationBarHeight: CGFloat = self.navigationController!.navigationBar.frame.height
iOS 14
나를 위해.view.windowiOS 14에서는 무효입니다.
extension UIViewController {
var topBarHeight: CGFloat {
var top = self.navigationController?.navigationBar.frame.height ?? 0.0
if #available(iOS 13.0, *) {
top += UIApplication.shared.windows.first?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
} else {
top += UIApplication.shared.statusBarFrame.height
}
return top
}
}
스위프트 5
네비게이션 바의 높이를 취득하려면maxY다음과 같이 safeArea 사이즈도 고려합니다.
let height = navigationController?.navigationBar.frame.maxY
iOS 13 이하 지원:
extension UIViewController {
var topbarHeight: CGFloat {
if #available(iOS 13.0, *) {
return (view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0.0) +
(self.navigationController?.navigationBar.frame.height ?? 0.0)
} else {
let topBarHeight = UIApplication.shared.statusBarFrame.size.height +
(self.navigationController?.navigationBar.frame.height ?? 0.0)
return topBarHeight
}
}
}
이거 먹어봤어?
let barHeight = self.navigationController?.navigationBar.frame.height ?? 0
UIImage*image = [UIImage imageNamed:@"logo"];
float targetHeight = self.navigationController.navigationBar.frame.size.height;
float logoRatio = image.size.width / image.size.height;
float targetWidth = targetHeight * logoRatio;
UIImageView*logoView = [[UIImageView alloc] initWithImage:image];
// X or Y position can not be manipulated because autolayout handles positions.
//[logoView setFrame:CGRectMake((self.navigationController.navigationBar.frame.size.width - targetWidth) / 2 , (self.navigationController.navigationBar.frame.size.height - targetHeight) / 2 , targetWidth, targetHeight)];
[logoView setFrame:CGRectMake(0, 0, targetWidth, targetHeight)];
self.navigationItem.titleView = logoView;
// How much you pull out the strings and struts, with autolayout, your image will fill the width on navigation bar. So setting only height and content mode is enough/
[logoView setContentMode:UIViewContentModeScaleAspectFit];
/* Autolayout constraints also can not be manipulated since navigation bar has immutable constraints
self.navigationItem.titleView.translatesAutoresizingMaskIntoConstraints = false;
NSDictionary*metricsArray = @{@"width":[NSNumber numberWithFloat:targetWidth],@"height":[NSNumber numberWithFloat:targetHeight],@"margin":[NSNumber numberWithFloat:20]};
NSDictionary*viewsArray = @{@"titleView":self.navigationItem.titleView};
[self.navigationItem.titleView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>margin=)-H:[titleView(width)]-(>margin=)-|" options:NSLayoutFormatAlignAllCenterX metrics:metricsArray views:viewsArray]];
[self.navigationItem.titleView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[titleView(height)]" options:0 metrics:metricsArray views:viewsArray]];
NSLog(@"%f", self.navigationItem.titleView.width );
*/
그래서 우리가 정말 필요한 건
UIImage*image = [UIImage imageNamed:@"logo"];
UIImageView*logoView = [[UIImageView alloc] initWithImage:image];
float targetHeight = self.navigationController.navigationBar.frame.size.height;
[logoView setFrame:CGRectMake(0, 0, 0, targetHeight)];
[logoView setContentMode:UIViewContentModeScaleAspectFit];
self.navigationItem.titleView = logoView;
Handy Swift 4 확장자는 다른 사람에게 도움이 될 수 있습니다.현재 뷰 컨트롤러에 탐색 모음이 표시되지 않는 경우에도 작동합니다.
import UIKit
extension UINavigationController {
static public func navBarHeight() -> CGFloat {
let nVc = UINavigationController(rootViewController: UIViewController(nibName: nil, bundle: nil))
let navBarHeight = nVc.navigationBar.frame.size.height
return navBarHeight
}
}
사용방법:
UINavigationController.navBarHeight()
전구가 켜지기 시작했어요.유감스럽게도, 아래 설명과 같이 문제를 해결하는 통일된 방법을 찾지 못했습니다.
내 모든 문제는 마스크의 자동 크기 조정에 집중되어 있다고 생각합니다.그 이유는 UI Web View의 유무에 관계없이 동일한 증상이 존재하기 때문입니다.그리고 그 증상은 초상화에 대한 모든 것이 순조롭다는 것이다.가로 세로에서는 맨 아래 UIButton이 TabBar 뒤에 팝업 표시됩니다.
예를 들어, 한 UIView에서는 위에서 아래로 다음과 같은 기능이 있습니다.
UIView – 양쪽 스프링 세트(기본 케이스)로 스트럿 없음
UIScroll View - 2개의 스프링을 설정하고 다른 모든 것(UIView 등)을 클리어하면 UIButton이 바로 위의 오브젝트에 침입합니다.모든 것을 클리어하면, UIButton은 OK입니다만, 맨 위에 있는 것은 Status Bar Setting의 맨 위 스트럿 뒤에 숨어 있기 때문에, UIButton은 Tab Bar 뒤에 팝업 되어 버립니다.
UILabel과 UIImage는 다음 단계입니다.톱 스트럿 세트, 다른 곳에서도 유연합니다.
UI Web View를 사용하는 소수의 그림을 완성합니다.
UI Web View - Struts :상단, 좌측, 우측 스프링 : 양쪽
UIButton – 아무것도 설정되어 있지 않다.즉, 어디에서나 유연성이 있다.
내 전구는 어둡지만 희망은 있어 보인다.
내 어플리케이션에는 네비게이션 컨트롤러 없이 UI에 커스터마이즈된 네비게이션 바가 몇 개 있습니다.또한 iOS 11보다 이전 버전에서는 iOS를 지원해야 하기 때문에 편리한 안전 영역 레이아웃 가이드를 사용할 수 없고 네비게이션 바의 위치와 높이를 프로그래밍 방식으로 조정해야 합니다.
위의 안전 영역 레이아웃 가이드를 건너뛰고 네비게이션 바를 슈퍼뷰에 직접 부착했습니다.상태 표시줄 높이는 UIApplication에서 쉽게 가져올 수 있지만 기본 탐색 표시줄 높이는 정말 고통스럽고...
거의 반나절 동안 많은 검색과 테스트를 거쳐 마침내 다른 게시물에서 힌트를 얻을 수 있었습니다(다만, 나에게 효과가 없습니다). UIView.size에서 실제로 높이를 얻을 수 있다는 것을 알게 되었습니다.That Fits()는 다음과 같습니다.
- (void)viewWillLayoutSubviews {
self.topBarHeightConstraint.constant = [UIApplication sharedApplication].statusBarFrame.size.height;
self.navBarHeightConstraint.constant = [self.navigationBar sizeThatFits:CGSizeZero].height;
[super viewWillLayoutSubviews];
}
마지막으로 내장된 것과 똑같은 완벽한 네비게이션 바!
다음은 귀하의 업데이트에 대한 제 답변의 시작입니다.
UI Web View의 콘텐츠 높이가 회전해도 변경되지 않는 이유는 무엇입니까?
자동 크기 조정에 모든 방향의 자동 크기 조정 마스크가 없기 때문일까요?
또 다른 제안입니다만, 툴바를 이용해 주세요.조금 더 심플하고, 항상 아래쪽에 자동 회전/위치가 있습니다.숨김/보여도 상관없습니다.이런 느낌: http://cdn.artoftheiphone.com/wp-content/uploads/2009/01/yellow-pages-iphone-app-2.jpg
당신은 그 선택지를 생각해봤을지 모르지만, 그냥 던져버려요.
또 하나의 아이디어로, 회전하고 있는 방향을 검출해, 프로그램적으로 버튼을 배치해 탭 바를 조정할 수 있습니다(코드로 가능합니다).
사용한 적이 있습니다.
let originY: CGFloat = self.navigationController!.navigationBar.frame.maxY
네비게이션 바 높이와 Y 원점을 얻으려면 잘 작동합니다.
만약 당신이 그것을 얻기를 원한다면navigationBar이만,, 심심니다다다다
extension UIViewController{
var navigationBarHeight: CGFloat {
return self.navigationController?.navigationBar.frame.height ?? 0.0
}
}
톱 하, 면, 면, 면, 신, 신, 신, 신, 신, 신, 신, 신, 신, 신, 신, 신, 신, however, however, however, however, however, however, however, however, however, however, however, however, the, the, however, the, the, the, the, the, the, the, the, the, , the, ,navigationBar를 statusBar는 그냥 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키,safeAreaInsets그게 존재하는 이유야
self.view.safeAreaInsets.top
Swift : 탐색바 바로 아래에 웹 뷰를 프로그래밍 방식으로 추가합니다.
는 iOS11을 사용하는 입니다.safeAreaLayoutGuide
Apple 문서(링크):
보기 중 막대 및 기타 컨텐츠에 의해 가려지지 않는 부분을 나타내는 레이아웃 가이드입니다.
을 ㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄹㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴㄴview.safeAreaLayoutGuide.topAnchor
이 모든 것은 예를 들어 다음과 같습니다.
import WebKit
class SettingsViewController: UIViewController {
let webView = WKWebView()
let url = URL(string: "https://www.apple.com")
override func viewDidLoad() {
super.viewDidLoad()
configureWebView()
}
override func viewWillAppear(_ animated: Bool) {
follow(url: url)
}
func follow(url: URL?) {
if let url = url {
let request = URLRequest(url: url)
webView.load(request)
}
}
func configureWebView() {
view.addSubview(webView)
webView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
webView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
webView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
webView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
webView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])
}
}
언급URL : https://stackoverflow.com/questions/7312059/programmatically-get-height-of-navigation-bar
'programing' 카테고리의 다른 글
| Node.js/Windows 오류: ENOENT, stat 'C:\Users\RT\AppData\로밍\npm' (0) | 2023.04.10 |
|---|---|
| 문자열의 일부 문자를 다른 문자로 바꾸기 (0) | 2023.04.10 |
| WPF의 리소스인 아이콘을 사용하려면 어떻게 해야 하나요? (0) | 2023.04.10 |
| 기능 프로그래밍의 '접기' 기능과 동등한 '피토닉'은 무엇입니까? (0) | 2023.04.10 |
| 문자열 앞에 $는 무엇을 의미합니까? (0) | 2023.04.10 |