Je suis confronté à un problème très étrange maintenant. Obtenir [[self view] bounds].size.width
toujours 320
ne change pas en fonction du périphérique. iPhone 5, 6 et 6 Plus pour tous ses retours 320.000000
dans toutes les méthodes.
- (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);
}
Sortie
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
Même l'écran de démarrage est également là.
Comment puis-je obtenir la taille réelle de la vue?
Utilisation
NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);
au lieu de
NSLog(@"%f", [[self view] bounds].size.width);
Cela donne u attendu w/h.
Si vous essayez de lire [[self view] bounds].size.width
value dans -(void) viewWillAppear:(BOOL)animated
, vous verrez qu'il affichera la bonne valeur.
Dans - (void)viewDidLoad
[[self view] bounds].size.width
vous montrera la conception exacte que vous avez dans le fichier .xib.
Voir ci-dessous des exemples et les résultats de 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];
}
Les résultats sont respectivement:
2016-02-17 19:00:47.519 xxxxx[16107:504629] 320.000000
2016-02-17 19:00:47.521 xxxxx[16107:504629] 414.000000
Cela se produit lorsque vous manquez le fichier launch pour iPhone 6 et 6 Plus. Essayez l’une de ces deux approches:
L'iPhone 6 (Retina HD 4.7) requiert une image de lancement portrait de 750 x 1334
. L'iPhone 6 Plus (Retina HD 5.5) requiert des images portrait et des images en format paysage, respectivement, de taille 1242 x 2208
et 2208 x 1242
.
Parfois, tout ce dont vous avez besoin est de faire de telles choses sur un main thread.
Pour moi,
DispatchQueue.main.async {
//access to the frame/bounds
}
Est travaillé puis accéder directement au cadre/lié.
Il est absolument nécessaire d'ajouter une image de lancement de taille appropriée pour iPhone 6 et iPhone 6 Plus. Sinon, ces appareils vont étirer 320 points en plein écran. Ainsi, vous obtenez 320 en largeur. Avec l'image de lancement, vous obtiendrez 475 ou 414 en largeur.
Utilisez plutôt - (void)viewWillLayoutSubviews
. Regardez ceci: Gestion de la mise en page
Utilisez viewDidLayoutSubviews method
Afficher la tâche associée dans la méthode viewWillLayoutSubviews ()
override func viewWillLayoutSubviews() {
print("view Size: \(view.bounds.width)")
}
Pouvez-vous s'il vous plaît faire un test en créant simplement un nouveau projet de test et en écrivant simplement ci-dessous trois instructions de journal dans la méthode viewDidLoad
de ViewController
, comme ceci -
- (void)viewDidLoad {
NSLog(@"screens = %@", [UIScreen screens]);
NSLog(@"self.frame= %@", NSStringFromCGRect([[UIScreen mainScreen] bounds]));
NSLog(@"self.view.frame= %@", NSStringFromCGRect(self.view.frame));
}
Construire et exécuter - Vous obtiendrez la résolution réelle du périphérique/écran/vue
Exemple de sortie
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}}
Je suis également confronté au même problème que vous avez rencontré. Je pense que votre contrôleur de vue a une largeur de 320. Après le chargement de votre vue, appelez une méthode après un certain délai, puis obtenez le cadre de la vue ou la vue correspondante. Vous obtenez le bon cadre.
-(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);
}
Utilisation:
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);
NSLog(@"%f", [[UIScreen mainScreen] bounds].size.height);
}
Vous devriez mieux vous fier aux limites de l’écran pour plusieurs raisons. Ils renverraient la valeur exacte pour différents appareils.
NSLog(@"Width: %f Height: %f"
,[[UIScreen mainScreen] bounds].size.width
,[[UIScreen mainScreen] bounds].size.height);