web-dev-qa-db-fra.com

iOS 11 images UIBarButtonItem pas dimensionnement

La réponse à ma question a été suggérée dans cette question , donc je pense que la solution consiste à désactiver la lecture automatique pour ma vue UIToolbar. 

Le code qui fonctionne pour les vues est

cButton.translatesAutoresizingMaskIntoConstraints = YES;

Mais je ne sais pas si cela s’applique à mon code car UIToolbar n’hérite pas de UIView.

J'ai beaucoup de petites images que j'utilise dans mes jeux et qui sont de tailles différentes en fonction de l'appareil et de l'orientation. Plutôt que d'avoir beaucoup d'images différentes et d'en ajouter de nouvelles lorsque Apple introduit de nouveaux appareils, j'ai décidé de créer une image 160x160 avant chaque image, puis de la redimensionner lorsqu'elle est utilisée. Cela fonctionnait bien sous iOS 4 - iOS 10 mais échouait sous iOS 11.

Le code est assez simple:

// Get the image
NSString *pictFile = [[NSBundle mainBundle] pathForResource:@"Correct" ofType:@"png"];
UIImage *imageToDisplay = [UIImage imageWithContentsOfFile:pictFile];
UIImage *cImage  = [UIImage imageWithCGImage:imageToDisplay.CGImage scale:[UIScreen mainScreen].scale orientation:imageToDisplay.imageOrientation];

UIButton *cButton = [UIButton buttonWithType:UIButtonTypeCustom];
[cButton setImage:cImage forState:UIControlStateNormal];
[cButton setTitle:@"c" forState:UIControlStateNormal];

//set the frame of the button to the size of the image
cButton.frame = CGRectMake(0, 0, standardButtonSize.width, standardButtonSize.height);

//create a UIBarButtonItem with the button as a custom view
c = [[UIBarButtonItem alloc] initWithCustomView:cButton];

Voici à quoi ça ressemble avant 11. Les éléments des boutons de la barre ont été redimensionnés et s'intègrent parfaitement dans la barre inférieure. Notez que j'ai réduit la taille de la coche de 50% juste pour m'assurer que je cherchais le bon code et qu'il se comporte comme je m'attendais.

 correct version

Voici à quoi ils ressemblent dans le simulateur pour Xcode 9.0 GM et iOS 11. Notez que la rangée supérieure de boutons est redimensionnée correctement mais que la rangée inférieure s’agrandit pour remplir l’espace alloué à la barre d’onglet. Le même comportement se produit sur les iPads et divers appareils. 

 iOS 11

Des idées sur la façon de désactiver Autolayout ou d'ajouter des contraintes?

14
JScarry

BarButtonItem (iOS11\xCode9) utilise autolayout au lieu d'images. Essayez ceci (Swift): 

if #available(iOS 9.0, *) {
    cButton.widthAnchor.constraint(equalToConstant: customViewButton.width).isActive = true
    cButton.heightAnchor.constraint(equalToConstant: customViewButton.height).isActive = true
}

Objectif c

if (@available(iOS 9, *)) {
     [cButton.widthAnchor constraintEqualToConstant: standardButtonSize.width].active = YES;
     [cButton.heightAnchor constraintEqualToConstant: standardButtonSize.height].active = YES;
}
44
Fallstreak

La réponse automnale (+1) était la solution dans mon cas. J'avais une vue personnalisée ne fonctionne pas sur le robinet. Je voulais simplement partager ce que je devais faire pour qu'un affichage personnalisé dans un élément de navigation fonctionne. C'est tout Swift 3

let backButtonView = BackButtonView.loadNib()
backButtonView?.addTarget(self, action: #selector(returnToPrevious), for: .touchUpInside)
backButtonView.widthAnchor.constraint(equalToConstant: backButtonView.frame.width).isActive = true
backButtonView.heightAnchor.constraint(equalToConstant: backButtonView.frame.height).isActive = true
self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButtonView!)

Les deux lignes concernant la largeur/hauteur de l'ancre proviennent de la réponse de Fallstreak et ont été la solution dans ce cas.

0
Micah Montoya