Изменяются ограничения при добавлении представления поверх окна или контроллера навигации?

#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.