web-dev-qa-db-fra.com

self.view.bounds.size.width renvoie une valeur incorrecte

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?

13
Tapas Pal

Utilisation 

NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);

au lieu de 

NSLog(@"%f", [[self view] bounds].size.width);

Cela donne u attendu w/h.

12
Gajendra K Chauhan

Si vous essayez de lire [[self view] bounds].size.widthvalue 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
9
icould

Cela se produit lorsque vous manquez le fichier launch pour iPhone 6 et 6 Plus. Essayez l’une de ces deux approches:

  1. Dans Xcode, accédez à votre cible générale, puis ajoutez-y le fichier d'écran de lancement ("Main"). 
  2. Si vous utilisez des catalogues d'actifs, accédez au catalogue d'actifs LaunchImages et ajoutez les nouvelles images de lancement des deux nouveaux iPhones. Vous devrez peut-être cliquer avec le bouton droit de la souris et choisir "Ajouter une nouvelle image de lancement" pour afficher un emplacement où ajouter les nouvelles images.

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.

3
Bhavin

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

3
Hemang

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.

2
konran

Utilisez plutôt - (void)viewWillLayoutSubviews. Regardez ceci: Gestion de la mise en page

2
ifou

Utilisez viewDidLayoutSubviews method

1
Himanshu Ahuja

Afficher la tâche associée dans la méthode viewWillLayoutSubviews () 

 override func viewWillLayoutSubviews() {
    print("view Size: \(view.bounds.width)")
}
0
bikram sapkota

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}}
0
Sanjay Mohnani

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);
}
0
Nirmalsinh

Utilisation: 

- (void)viewDidLoad 
{
    [super viewDidLoad];
    NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);
    NSLog(@"%f", [[UIScreen mainScreen] bounds].size.height);
}
0
Nick

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);
0
Tough Guy