iOS 13에서 상태 표시줄 배경색과 텍스트 색을 변경하는 방법은 무엇입니까?
iOS 13 상태가 도래함에 따라 Bar의 보기는 더 이상 액세스할 수 없습니다.
value(forKey: "statusBar") as? UIView
대상:
감지되지 않은 예외 'NSInternalInconsistencyException', 이유: 'UIApplication에서 -statusBar 또는 -statusBarWindow라고 하는 앱: 더 이상 상태 표시줄이나 상태 표시줄 창이 없으므로 이 코드를 변경해야 합니다.대신 창 씬(scene)에서 statusBarManager 개체를 사용합니다.'
하지만 색깔을 바꾸는 데 어떻게 사용해야 하는지는 명확하지 않습니다.keyWindow?.windowScene?.statusBarManager에는 관련된 내용이 포함되어 있지 않습니다.
(iOS 10, *) 호환성으로 코드를 컴파일하고 있으므로 UIKit을 계속 사용할 계획입니다.
이 주제에 대한 의견이 있습니까?
몇 가지 조건을 추가하거나 첫 번째 조건을 사용할 수 있습니다.UIA 응용 프로그램을 위한 확장만 생성하면 됩니다.
extension UIApplication {
var statusBarUIView: UIView? {
if #available(iOS 13.0, *) {
let tag = 38482
let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
if let statusBar = keyWindow?.viewWithTag(tag) {
return statusBar
} else {
guard let statusBarFrame = keyWindow?.windowScene?.statusBarManager?.statusBarFrame else { return nil }
let statusBarView = UIView(frame: statusBarFrame)
statusBarView.tag = tag
keyWindow?.addSubview(statusBarView)
return statusBarView
}
} else if responds(to: Selector(("statusBar"))) {
return value(forKey: "statusBar") as? UIView
} else {
return nil
}
}
}
업데이트됨: 죄송합니다. 실제 프로젝트에서 테스트할 시간이 부족하지만 "Hello world" 앱에서 작동합니다.키 Windows 및 상태 BarFrame에 대한 자세한 정보를 읽어 개선할 수 있습니다.
extension UIApplication {
var statusBarUIView: UIView? {
if #available(iOS 13.0, *) {
let tag = 3848245
let keyWindow = UIApplication.shared.connectedScenes
.map({$0 as? UIWindowScene})
.compactMap({$0})
.first?.windows.first
if let statusBar = keyWindow?.viewWithTag(tag) {
return statusBar
} else {
let height = keyWindow?.windowScene?.statusBarManager?.statusBarFrame ?? .zero
let statusBarView = UIView(frame: height)
statusBarView.tag = tag
statusBarView.layer.zPosition = 999999
keyWindow?.addSubview(statusBarView)
return statusBarView
}
} else {
if responds(to: Selector(("statusBar"))) {
return value(forKey: "statusBar") as? UIView
}
}
return nil
}
}
안타깝게도 Apple은 상태 표시줄에 액세스하고 속성을 편집하는 언급된 방법 중 일부를 사용하지 않았습니다.다음을 사용해야 합니다.StatusBarManager의 목적.WindowScene다음 방법은 iOS 13 이상에서 작동합니다.
extension UINavigationController {
func setStatusBar(backgroundColor: UIColor) {
let statusBarFrame: CGRect
if #available(iOS 13.0, *) {
statusBarFrame = view.window?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero
} else {
statusBarFrame = UIApplication.shared.statusBarFrame
}
let statusBarView = UIView(frame: statusBarFrame)
statusBarView.backgroundColor = backgroundColor
view.addSubview(statusBarView)
}
}
이 문제는 전에 발생한 적이 있습니다.XCode 11과 Swift 5.0을 사용하여 이 코드를 실행하는 동안 애플리케이션이 손상되었습니다.
이전 코드:-
UIApplication.shared.statusBarView?.backgroundColor = UIColor.init(red: 243/250, green: 243/250, blue: 243/250, alpha: 1)
방금 변경된 내용:-
if #available(iOS 13.0, *) {
let statusBar = UIView(frame: UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero)
statusBar.backgroundColor = UIColor.init(red: 243/250, green: 243/250, blue: 243/250, alpha: 1)
UIApplication.shared.keyWindow?.addSubview(statusBar)
} else {
UIApplication.shared.statusBarView?.backgroundColor = UIColor.init(red: 243/250, green: 243/250, blue: 243/250, alpha: 1)
}
이제 제 문제는 해결되었습니다.해피 코딩.
swift 5.0을 위해 배경색을 바꾸기 위해 이 작업을 수행했습니다.
if #available(iOS 13.0, *) {
let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
// Reference - https://stackoverflow.com/a/57899013/7316675
let statusBar = UIView(frame: window?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero)
statusBar.backgroundColor = .white
window?.addSubview(statusBar)
} else {
UIApplication.shared.statusBarView?.backgroundColor = .white
UIApplication.shared.statusBarStyle = .lightContent
}
https://medium.com/ @trivediniiki94/traved-after-tax-xcode-11-ios-13-b52b36e05fa8
스위프트 5에서 작동했습니다.
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 13, *)
{
let statusBar = UIView(frame: (UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame)!)
statusBar.backgroundColor = #colorLiteral(red: 0.2346, green: 0.3456, blue: 0.5677, alpha: 1)
UIApplication.shared.keyWindow?.addSubview(statusBar)
} else {
// ADD THE STATUS BAR AND SET A CUSTOM COLOR
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to:#selector(setter: UIView.backgroundColor)) {
statusBar.backgroundColor = #colorLiteral(red: 0.2346, green: 0.3456, blue: 0.5677, alpha: 1)
}
UIApplication.shared.statusBarStyle = .lightContent
}
}
테스트를 거쳐 100% 작업 완료
func statusBarColorChange(){
if #available(iOS 13.0, *) {
let statusBar = UIView(frame: UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero)
statusBar.backgroundColor = AppThemeColor
statusBar.tag = 100
UIApplication.shared.keyWindow?.addSubview(statusBar)
} else {
let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
statusBar?.backgroundColor = AppThemeColor
}
}
}
키 창에서 상태 표시줄 제거
func removeStatusBar(){
if #available(iOS 13.0, *) {
UIApplication.shared.keyWindow?.viewWithTag(100)?.removeFromSuperview()
}
}
에viewDidLoad그리고.viewWillAppear함수를 호출합니다.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
removeStatusBar()
statusBarColorChange()
}
override func viewDidLoad() {
super.viewDidLoad()
removeStatusBar()
statusBarColorChange()
}
다음 코드를 사용합니다.
if (@available(iOS 13, *)) {
let statusBar1 = UIView()
statusBar1.frame = UIApplication.shared.statusBarFrame
statusBar1.backgroundColor = UIColor.red
UIApplication.shared.keyWindow?.addSubview(statusBar1)
}
이 결과를 달성하기 위해:
키 창은 iOS13에서 더 이상 사용되지 않습니다.당신은 이 확장을 swift 5와 iOS 13에 사용할 수 있습니다.
extension UIApplication {
var statusBarUIView: UIView? {
if #available(iOS 13.0, *) {
let tag = 3848245
let keyWindow: UIWindow? = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
if let statusBar = keyWindow?.viewWithTag(tag) {
return statusBar
} else {
let height = keyWindow?.windowScene?.statusBarManager?.statusBarFrame ?? .zero
let statusBarView = UIView(frame: height)
statusBarView.tag = tag
statusBarView.layer.zPosition = 999999
keyWindow?.addSubview(statusBarView)
return statusBarView
}
} else {
if responds(to: Selector(("statusBar"))) {
return value(forKey: "statusBar") as? UIView
}
}
return nil
}
}
그리고 다음과 같이 AppDelegate 클래스의 옵션을 사용하여 FinishLaunchingWithOptions에서 사용합니다.
UIApplication.shared.statusBarUIView?.backgroundColor = .red(any color)
if (@available(iOS 13, *))
{
UIView *statusBar = [[UIView alloc]initWithFrame:[UIApplication sharedApplication].keyWindow.windowScene.statusBarManager.statusBarFrame] ;
statusBar.backgroundColor = [UIColor redColor];
[[UIApplication sharedApplication].keyWindow addSubview:statusBar];
}
이것을 시도해보세요.
if (@available(iOS 13, *))
{
UIView *_localStatusBar = [[UIApplication sharedApplication].keyWindow.windowScene.statusBarManager performSelector:@selector(createLocalStatusBar)];
statusBar = [_localStatusBar performSelector:@selector(statusBar)];
}
else
{
statusBar = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
}
Use this Extension:
extension UINavigationController {
func setStatusBar(backgroundColor: UIColor) {
let statusBarFrame: CGRect
if #available(iOS 13.0, *) {
statusBarFrame = view.window?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero
} else {
statusBarFrame = UIApplication.shared.statusBarFrame
}
let statusBarView = UIView(frame: statusBarFrame)
statusBarView.backgroundColor = backgroundColor
view.addSubview(statusBarView)
}}
만약 당신이 당신의 모든 앱을 위해 그것을 만들고 싶다면, 당신은 당신에게 정보를 추가할 수 있습니다.plist 이 키들과 그들의 값들.
View controller-based status bar appearance - NO
Status bar style - Light Content
이것은 여전히 그것을 사용하고 있는 저와 같은 사람들을 위해 가장 많이 투표된 답변의 ObjC 버전입니다.
UIA 응용 프로그램 범주를 생성하여 프로젝트에 추가합니다.
@implementation UIApplication (iOS13PorcoDiDio)
- (UIView*) statusBar
{
if([UIDevice getOSVersion] >= 13)
{
const NSUInteger k_TAG_STATUSBAR = 38482458385;
UIView * vStatusBar = [[UIApplication sharedApplication].keyWindow viewWithTag:k_TAG_STATUSBAR];
if(vStatusBar != nil)
return vStatusBar;
else {
UIView *vStatusBar = [[UIView alloc] initWithFrame:[UIApplication sharedApplication].statusBarFrame];
[vStatusBar setTag:k_TAG_STATUSBAR];
[[UIApplication sharedApplication].keyWindow addSubview:vStatusBar];
return vStatusBar;
}
} else if([UIApplication respondsToSelector:@selector(statusBar)])
return (UIView*)[UIApplication sharedApplication].statusBar;
else
return nil;
}
@end
이것은 내가 본 최고의 대답입니다.건배.
if #available(iOS 13.0, *) {
let app = UIApplication.shared
let statusBarHeight: CGFloat = app.statusBarFrame.size.height
let statusbarView = UIView()
statusbarView.backgroundColor = ColorPalette.grayChateau
view.addSubview(statusbarView)
statusbarView.translatesAutoresizingMaskIntoConstraints = false
statusbarView.heightAnchor
.constraint(equalToConstant: statusBarHeight).isActive = true
statusbarView.widthAnchor
.constraint(equalTo: view.widthAnchor, multiplier: 1.0).isActive = true
statusbarView.topAnchor
.constraint(equalTo: view.topAnchor).isActive = true
statusbarView.centerXAnchor
.constraint(equalTo: view.centerXAnchor).isActive = true
} else {
let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
statusBar?.backgroundColor = UIColor.red
}
ViewController 대신 NavigationController를 사용하는 것이 가장 간단한 방법이라고 생각합니다.스토리보드를 사용하여 탐색 모음 배경을 변경하면 상태 표시줄에도 반영됩니다.
이렇게 하면 statusBar를 가져올 수 있지만 statusBar backgroundColor를 설정할 수 없습니다.
UIView *statusBar;
if (@available(iOS 13, *)) {
UIView *_localStatusBar = [[UIApplication sharedApplication].keyWindow.windowScene.statusBarManager performSelector:@selector(createLocalStatusBar)];
statusBar = [_localStatusBar performSelector:@selector(statusBar)];
}
else {
statusBar = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
}
if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
statusBar.backgroundColor = [UIColor redColor];
}
언급URL : https://stackoverflow.com/questions/56651245/how-to-change-the-status-bar-background-color-and-text-color-on-ios-13
'programing' 카테고리의 다른 글
| SQL LIMIT 및 OFFSET 쿼리를 사용하여 모든 레코드 선택 (0) | 2023.08.30 |
|---|---|
| php에서 CSV 파일을 업로드하고 구문 분석하는 방법 (0) | 2023.08.30 |
| CSS의 부모로부터 자식 불투명도를 상속받고 싶지 않습니다. (0) | 2023.08.30 |
| PHP 치명적 오류 필요한 파일을 열지 못했습니다. (0) | 2023.08.30 |
| 마지막 프레임에서 CSS3 애니메이션 중지 (0) | 2023.08.30 |


