Ответ 1
Используйте
NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);
вместо
NSLog(@"%f", [[self view] bounds].size.width);
Он дает ожидаемое значение w/h.
Сейчас я столкнулся с очень странной проблемой. Получение [[self view] bounds].size.width
всегда 320
не меняется в зависимости от устройства. iPhone 5, 6 и 6 Plus для всех он возвращает 320.000000
ниже всех методов.
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"%f", [[self view] bounds].size.width);
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"%f", [[self view] bounds].size.width);
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"%f", [[self view] bounds].size.width);
}
Выход
2015-02-11 14:48:03.274 MyApp[2948:86285] 320.000000
2015-02-11 14:48:03.274 MyApp[2948:86285] 320.000000
2015-02-11 14:48:03.783 MyApp[2948:86285] 320.000000
Даже экран заставки также присутствует.
Как я могу получить фактический размер представления?
Используйте
NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);
вместо
NSLog(@"%f", [[self view] bounds].size.width);
Он дает ожидаемое значение w/h.
Если вы попытаетесь прочитать [[self view] bounds].size.width
значение в -(void) viewWillAppear:(BOOL)animated
, вы увидите, что оно отобразит правильное значение.
В - (void)viewDidLoad
[[self view] bounds].size.width
будет отображаться точный дизайн, который у вас есть в файле .xib.
Ниже приведены примеры и результаты NSLog.
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
NSLog(@"%f",[[self view] bounds].size.width);
}
-(void) viewWillAppear:(BOOL)animated{
NSLog(@"%f",[[self view] bounds].size.width);
[testIndicator startAnimatingInView:self.view];
}
Соответственно результаты:
2016-02-17 19:00:47.519 xxxxx[16107:504629] 320.000000
2016-02-17 19:00:47.521 xxxxx[16107:504629] 414.000000
Это происходит, поскольку вам не хватает файла запуска для iPhone 6 и 6 Plus. Попробуйте один из этих двух подходов:
Для iPhone 6 (Retina HD 4.7) требуется изображение для запуска с портретом 750 x 1334
.
IPhone 6 Plus (Retina HD 5.5) требует как портретных, так и ландшафтных изображений размером 1242 x 2208
и 2208 x 1242
соответственно.
Совершенно необходимо, чтобы вы добавляли образ запуска подходящего размера для iPhone 6 и iPhone 6 Plus. В противном случае эти устройства будут растягивать ширину 320 точек на весь экран. Таким образом, вы получите 320 сообщений в виде ширины. С изображением запуска вы получите 475 или 414, которые будут указаны как ширина.
Используйте - (void)viewWillLayoutSubviews
вместо этого.
Посмотрите на это: Управление макетом просмотра
Можете ли вы выполнить тест, просто создав новый тестовый проект и просто напишите ниже трех операторов журнала внутри метода viewDidLoad
ViewController
, например:
- (void)viewDidLoad {
NSLog(@"screens = %@", [UIScreen screens]);
NSLog(@"self.frame= %@", NSStringFromCGRect([[UIScreen mainScreen] bounds]));
NSLog(@"self.view.frame= %@", NSStringFromCGRect(self.view.frame));
}
Сборка и запуск - вы получите фактическое разрешение устройства/экрана/представления
Пример вывода -
2015-02-11 12:45:19.116 Test[1558:87057] screens = (
"<UIScreen: 0x7ff0b970bcc0; bounds = {{0, 0}, {375, 667}}; mode = <UIScreenMode: 0x7ff0b961b500; size = 750.000000 x 1334.000000>>"
)
2015-02-11 12:45:19.117 Test[1558:87057] self.frame= {{0, 0}, {375, 667}}
2015-02-11 12:45:19.117 Test[1558:87057] self.view.frame= {{0, 0}, {375, 667}}
Я также сталкиваюсь с той же проблемой, с которой вы столкнулись. Я думаю, что ваш viewcontroller имеет ширину 320. После загрузки вашего вида просмотрите один метод после некоторой задержки, а затем получите рамку просмотра или просмотр. Вы получаете правильную рамку.
-(void)viewDidLoad
{
[NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(getMyFrame) userInfo:nil repeats:NO];
[super viewDidLoad];
}
-(void)getMyFrame
{
NSLog(@"%f", [[self view] bounds].size.width);
}
Представление связанной задачи в viewWillLayoutSubviews() метод
override func viewWillLayoutSubviews() {
print("view Size: \(view.bounds.width)")
}
Вам следует больше полагаться на границы экрана по нескольким причинам. Они вернут точное значение для разных устройств.
NSLog(@"Width: %f Height: %f"
,[[UIScreen mainScreen] bounds].size.width
,[[UIScreen mainScreen] bounds].size.height);
Использовать метод viewDidLayoutSubviews
Использование:
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);
NSLog(@"%f", [[UIScreen mainScreen] bounds].size.height);
}