iOS 7 이상 :보기 컨트롤러별로 상태 표시 줄 스타일 설정
상태 표시 줄 스타일 (기본값 또는 lightcontent)을 설정하기 위해 여러 가지 방법을 시도했지만 뷰 컨트롤러별로 작동하도록 만들 수 없습니다. 전체 앱에 대해서만 상태 표시 줄 스타일을 설정할 수 있습니다.
누구 힌트가 있습니까?
나는 시도했다 UIViewControllerBasedStatusBarAppearance
과
-(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
그러나 이러한 방법은 작동하지 않습니다.
이거 해봤 어?
Info.plist에서 "컨트롤러 기반 상태 표시 줄 모양보기"(
UIViewControllerBasedStatusBarAppearance
)를YES
로 설정합니다. (YES
이 기본값이므로 plist에서이 값을 그대로 둘 수도 있습니다.)viewDidLoad 메서드에서
[self setNeedsStatusBarAppearanceUpdate]
.preferredStatusBarStyle
이 뷰 컨트롤러에 대해 원하는 상태 표시 줄 스타일을 반환하는을 구현 합니다.- (UIStatusBarStyle) preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
뷰 컨트롤러가 Storyboard 기반 UINavigationController의 일부가 아닌 독립형 UINavigationController 내부에 있으면 무엇보다도 모든 메서드가 실패합니다. 나는이 상황을 만났고 상태 표시 줄을 밝은 스타일로 설정하기 위해 다음을 사용했습니다.
[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
이것은 나를 위해 완벽하게 작동했습니다.
편집 :이 솔루션은 iOS 9에서 더 이상 사용되지 않습니다. 다른 답변 중 하나를 선택하십시오.
UIViewControllerBasedStatusBarAppearance
NO로 설정 하면 다음을 사용 하여 스타일을 흰색 텍스트로 설정할 수 있습니다.
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackTranslucent;
이 스타일의 텍스트 색상은 iOS 6 이하에서 흰색 이었기 때문입니다.
업데이트 : @jowie에 따르면 iOS8에서 시도해 볼 수 있습니다.
[UIApplication sharedApplication].statusBarStyle = UIBarStyleBlack;
Swift에서는 다음과 같이 작성하여이를 수행 할 수있었습니다.
let tbc : UITabBarController = self.window?.rootViewController as UITabBarController
var moreViewController : UINavigationController = tbc.moreNavigationController
moreViewController.navigationBar.barStyle = UIBarStyle.Black
기본적으로 마지막 줄에 관심이 있습니다.
이로 인해 탭 바가 흰색으로 변경되었습니다.
Info.plist
이 결과를 얻기 위해 아무것도 변경하지 않았습니다 .
변경에 대한 자세한 내용은 Navigation Status Bar
다음 링크를 확인하십시오. http://www.appcoda.com/customize-navigation-status-bar-ios-7/
viewDidLoad 메소드에서 다음을 입력하십시오.
목표 C
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[self setNeedsStatusBarAppearanceUpdate];
빠른
UIApplication.shared.statusBarStyle = .lightContent
self.setNeedsStatusBarAppearanceUpdate()
내비게이션 컨트롤러에 뷰 컨트롤러가 내장되어 있다고 확신합니다. .Black
이 하위 클래스 를 사용 하도록 탐색 모음의 스타일을 설정하지 않으려면 :
class YourNavigationController: UINavigationController {
override func childViewControllerForStatusBarStyle() -> UIViewController? {
return topViewController
}
}
빠른:
let tbc : UITabBarController = self.window?.rootViewController as UITabBarController
var moreViewController : UINavigationController = tbc.moreNavigationController
moreViewController.navigationBar.barStyle = UIBarStyle.Black
목표 C :
이것을 controller.m
파일 viewDidLoad 메소드에 추가하십시오 .
[self setNeedsStatusBarAppearanceUpdate].
그런 다음 동일한 controller.m
파일 에서이 메서드를 구현 합니다.
- (UIStatusBarStyle) preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
공식 문서 :
내 블로그에 쓴 기사 :
http://www.ryadel.com/2015/03/04/xcode-set-status-bar-style-and-color-in-objective-c/
상태 표시 줄의 색상을 변경하려는 ViewController에서
- (void) viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}
- (void) viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
나는 항상 이것이 어떻게 작동하는지 잊기 때문에 이것을위한 신속한 확장
extension UIViewController {
// utility to set the status bar appearance
// Note: Make sure "View controller-based status bar appearance" is set to NO in your target settings or this won't work
func setStatusBarForDarkBackground(dark: Bool) {
UIApplication.sharedApplication().statusBarStyle = dark ? .LightContent : .Default
setNeedsStatusBarAppearanceUpdate()
}
}
Xcode 10.3,
iPhone 8 12.4 Simulator에서는 OK입니다.
iPhone X 12.4 Simulator에서 위의 모든 것을 시도했지만 괜찮지 않았습니다.
그런 다음 손으로 추가하면 상태 표시 줄은 시간, 배터리, 셀룰러로 구성됩니다.
StatusBarView
class StatusBottomView: UIView {
private var batteryView:BatteryView!
private var timeLabel:UILabel!
private var timer:Timer?
override init(frame: CGRect) {
super.init(frame: frame)
addSubviews()
}
private func addSubviews() {
batteryView = BatteryView()
batteryView.tintColor = UIColor.blue
addSubview(batteryView)
timeLabel = UILabel()
timeLabel.textAlignment = .center
timeLabel.font = UIFont.systemFont(ofSize: 12)
timeLabel.textColor = UIColor.blue
addSubview(timeLabel)
didChangeTime()
addTimer()
}
override func layoutSubviews() {
super.layoutSubviews()
let h = frame.size.height
let x: CGFloat = 80
batteryView.frame.origin = CGPoint(x: ScreenHeight - x - DZMBatterySize.width, y: (h - DZMBatterySize.height) / 2)
timeLabel.frame = CGRect(x: x, y: 0, width: 50, height: h)
}
// MARK: -- Timer
func addTimer() {
if timer == nil {
timer = Timer.scheduledTimer(timeInterval: 15, target: self, selector: #selector(didChangeTime), userInfo: nil, repeats: true)
RunLoop.current.add(timer!, forMode: .common)
}
}
func removeTimer() {
if timer != nil {
timer!.invalidate()
timer = nil
}
}
@objc func didChangeTime() {
timeLabel.text = TimerString("HH:mm")
batteryView.batteryLevel = UIDevice.current.batteryLevel
}
}
BatteryLevelView
class BatteryView: UIImageView {
override var tintColor: UIColor! {
didSet{ batteryLevelView.backgroundColor = tintColor }
}
/// BatteryLevel
var batteryLevel:Float = 0 {
didSet{ setNeedsLayout() }
}
/// BatteryLevelView
private var batteryLevelView:UIView!
convenience init() {
self.init(frame: CGRect(x: 0, y: 0, width: DZMBatterySize.width, height: DZMBatterySize.height))
}
override init(frame: CGRect) {
super.init(frame: CGRect(x: 0, y: 0, width: DZMBatterySize.width, height: DZMBatterySize.height))
addSubviews()
}
func addSubviews() {
batteryLevelView = UIView()
batteryLevelView.layer.masksToBounds = true
addSubview(batteryLevelView)
image = UIImage(named: "battery_black")?.withRenderingMode(.alwaysTemplate)
tintColor = UIColor.white
}
override func layoutSubviews() {
super.layoutSubviews()
let spaceW:CGFloat = 1 * (frame.width / DZMBatterySize.width) * HJBatteryLevelViewScale
let spaceH:CGFloat = 1 * (frame.height / DZMBatterySize.height) * HJBatteryLevelViewScale
let batteryLevelViewY:CGFloat = 2.1*spaceH
let batteryLevelViewX:CGFloat = 1.4*spaceW
let batteryLevelViewH:CGFloat = frame.height - 3.4*spaceH
let batteryLevelViewW:CGFloat = frame.width * HJBatteryLevelViewScale
let batteryLevelViewWScale:CGFloat = batteryLevelViewW / 100
var tempBatteryLevel = batteryLevel
if batteryLevel < 0 {
tempBatteryLevel = 0
}else if batteryLevel > 1 {
tempBatteryLevel = 1
}
batteryLevelView.frame = CGRect(x: batteryLevelViewX , y: batteryLevelViewY, width: CGFloat(tempBatteryLevel * 100) * batteryLevelViewWScale, height: batteryLevelViewH)
batteryLevelView.layer.cornerRadius = batteryLevelViewH * 0.125
}
}
'developer tip' 카테고리의 다른 글
if 문에서 여러 값에 대한 JQuery .hasClass (0) | 2020.10.13 |
---|---|
Xcode 디버깅-이미지 표시 (0) | 2020.10.13 |
방법과 선택기의 차이점은 무엇입니까? (0) | 2020.10.12 |
추가 클래스 경로 옵션을 사용하여 "java -jar MyFile.jar"호출 (0) | 2020.10.12 |
pandas 데이터 프레임을 여러 열로 필터링하는 방법 (0) | 2020.10.12 |