#ios #objective-c #autolayout #statusbar
#iOS #objective-c #автоматическое описание #строка состояния
Вопрос:
У меня было приложение, в котором мне нужно отображать пользовательскую строку состояния по всему приложению. Для чего я написал этот код в didFinishLaunchingWithOptions:
метод
self.window.windowLevel = UIWindowLevelStatusBar;
Затем в ViewController я создал представление с (0, 0, width, 20) рамкой и добавил к нему некоторые элементы.
Я пытаюсь добавить этот вид над окном следующим образом
AppDelegate *appdelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[self.statusview setTranslatesAutoresizingMaskIntoConstraints:YES];
[appdelegate.window addSubview:statusview];
Но он добавляется в левом верхнем углу без каких-либо элементов. Но когда я устанавливаю ширину и снова добавляю элементы, тогда он отображается.
Кто-нибудь может мне помочь в этом?
Ответ №1:
я думаю, что ваша проблема заключается в ширине представления, убедитесь, что ширина правильная.
если ширина правильная, а проблема все еще здесь, пожалуйста, обновите свой код и скриншот.
Комментарии:
1. я также добавил ограничение ширины, когда добавляю эту строку statusview.frame=CGRectMake(0, 0, self.view.frame.size.width, 20); элементы внутри него не отображаются
2. измените self.view.frame.size.width на [uiscreen mainscreen].bounds.size.width , попробуйте еще раз.
3. тот же результат. добавлено правильно, но внутренние элементы отсутствуют
4. не могли бы вы обновить больше кодов метода didFinishLaunchingWithOptions.
5. я делаю это в контроллере представления с помощью свойства view.там ничего нет. просто возврат да
Ответ №2:
- (BOOL)prefersStatusBarHidden {
return YES;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
_statusview.frame = CGRectMake(0, 50, self.view.frame.size.width, 45);
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
_statusview.frame = CGRectMake(0, 0, self.view.frame.size.width, 45);
}
- (void)viewDidLoad {
[super viewDidLoad];
_statusview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 45)];
_statusview.backgroundColor = [UIColor blackColor];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(0, 0, 100, 25);
btn.center = _statusview.center;
[btn setTitle:@"button" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btn setBackgroundColor:[UIColor whiteColor]];
[_statusview addSubview:btn];
[_statusview setTranslatesAutoresizingMaskIntoConstraints:YES];
[self.view addSubview:_statusview];
self.view.backgroundColor = [UIColor whiteColor];
}
поместите код в viewdidload. это то, что вы хотите?
Комментарии:
1. фактически, над окном или над представлением эффект тот же.
2. Если вам нужно, чтобы представление всегда превыше всех представлений, все, что вам нужно, — это родительский контроллер, а все дочерние контроллеры наследуют родительский класс.
3. если я установлю фрейм, он не будет отображать внутренние элементы. это я уже говорил вам
4. не могли бы вы рассказать мне, как вы создаете элементы в представлении? я меняю свой код и тестирую, когда я касаюсь кнопки began или touchend, которая всегда находится внутри statusview.