2017-09-15 18 views
13

Odpowiedź na moje pytanie została zasugerowana w this question, więc myślę, że odpowiedź jest, aby wyłączyć autolayout dla mojego widoku UIToolbar.iOS 11 UIBarButtonItem images not sorting

Kod, który mówi do pracy dla poglądów jest

cButton.translatesAutoresizingMaskIntoConstraints = YES; 

Ale nie jestem pewien, czy to dotyczy mojego kodu od UIToolbar nie dziedziczy z UIView.

Mam wiele małych obrazów, których używam w moich grach, które różnią się rozmiarami w zależności od urządzenia i orientacji. Zamiast wielu różnych obrazów i dodawania nowych, gdy Apple wprowadza nowe urządzenia, postanowiłem zrobić jeden obraz 160x160 przed każdym, a następnie zmienić jego rozmiar, gdy jest używany. To działało w porządku z iOS 4 - iOS 10, ale nie w iOS 11.

Kod jest dość prosta:

// 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]; 

To co wygląda pre11. Elementy paska przycisków zostały przeskalowane i ładnie pasują na dolnym pasku. Zauważ, że zmniejszyłem rozmiar znacznika wyboru o 50%, aby upewnić się, że patrzę na poprawny kod i że zachowuje się tak, jak się spodziewam.

correct version

Oto jak wyglądają w symulatorze dla Xcode 9.0 GM i iOS 11. Należy zauważyć, że górny rząd przycisków rozmiaru poprawnie ale dolny rząd rozwiń, aby wypełnić przestrzeń przeznaczoną na pasku kart. To samo zachowanie dzieje się na iPadach i różnych urządzeniach.

iOS 11

Wszelkie pomysły dotyczące sposobu wyłączania autoLayout lub dodać ograniczenia?

Odpowiedz

42

BarButtonItem (iOS11 \ xCode9) używa autolayout zamiast ramek. Spróbuj tego (SWIFT):

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

Objective C

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

Dzięki za podpowiedź. Dodałem wersję Obj C. – JScarry

+0

Świetnie! to zadziałało dla mnie. dziękuję. – Bucket

0

Fallstreak odpowiedź (+1) było rozwiązanie w moim przypadku. Miałem niestandardowy widok, który nie działa po dotknięciu. Chciałem tylko udostępnić, co muszę zrobić, aby niestandardowy widok w elemencie nawigacyjnym działał. To wszystko 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!) 

2 linii o szerokości/wysokości kotwicy pochodzi odpowiedź Fallstreak i były rozwiązaniem w tym przypadku.