Ten kod działa dobrze w ios10. dostaję swoją etykietę i przycisk obrazu, który jest profilem zdjęcia użytkownika, okrągły okrągły ... ok. ale podczas uruchamiania symulatora xcode 9 ios11 dostaję go rozciągniętym. Ramka przycisku musi mieć rozmiar 32x32, podczas sprawdzania karty SIM i uzyskiwania widoku i mówienia xcode, aby opisał widok, który otrzymuję jako 170x32 lub coś podobnego.
oto mój kod.
let labelbutton = UIButton( type: .system)
labelbutton.addTarget(self, action:#selector(self.toLogin(_:)), for: .touchUpInside)
labelbutton.setTitleColor(UIColor.white, for: .normal)
labelbutton.contentHorizontalAlignment = .right
labelbutton.titleLabel?.font = UIFont.systemFont(ofSize: 18.00)
let button = UIButton(type: .custom)
button.addTarget(self, action:#selector(self.toLogin(_:)), for: .touchUpInside)
button.frame = CGRect(x: 0, y: 0, width: 32, height: 32)
button.setTitleColor(UIColor.white, for: .normal)
button.setTitleColor(UIColor.white, for: .highlighted)
var buttomItem : UIBarButtonItem = UIBarButtonItem()
buttomItem.customView = button
buttomItem.target = self
buttomItem.action = "ToLogin"
var labelItem : UIBarButtonItem = UIBarButtonItem()
labelItem.customView = labelbutton
labelItem.target = self
labelItem.action = "ToLogin"
if let user = PFUser.current() {
print("LOGIN : checkiando si existe usuario ")
labelbutton.setTitle(USERNAME, for: UIControlState.normal)
labelbutton.sizeToFit()
if(user["profile_photo_url"] != nil) {
print(" ENCONTRO PROFILE PHOTO URL NOT NIL Y ES \(user["profile_photo_url"])")
let photoURL = user["profile_photo_url"] as! String
let a = LoginService.sharedInstance
a.downloadImage(url: photoURL, complete: { (complete) in
if (complete) {
button.setImage(LoginService.sharedInstance.profile_photo! , for: UIControlState.normal)
button.layer.cornerRadius = 0.5 * button.bounds.size.width
// button.imageView!.contentMode = .scaleAspectFit
// button.imageView!.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
//button.imageView!.contentMode = .scaleAspectFit
//button.imageView!.clipsToBounds = true
//button.imageView!.layer.cornerRadius = 60
button.clipsToBounds = true
self.NavigationItem.rightBarButtonItems = [buttomItem,labelItem]
}
})
} else {
self.NavigationItem.rightBarButtonItem = labelItem
}
print(" EL FRAME DEL BUTTON ES \(button.frame)")
} else {
labelbutton.setTitle("Login", for: UIControlState.normal)
labelbutton.sizeToFit()
self.NavigationItem.rightBarButtonItem = labelItem
}
UIButton
wnętrzeUIBarButtonItem
, użyjbutton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: -20)
Odpowiedzi:
Powód
Problem pojawia się, ponieważ od ios 11
UIBarButtonItem
używa autoukładu zamiast zajmować się ramkami.Rozwiązanie
Powinieneś dodać ograniczenie szerokości do tego przycisku obrazu, jeśli używasz Xcode 9.
PS
button
nie jestUIBarButtonItem
, jest wUIButton
środkuUIBarButtonItem
. Powinieneś ustawić ograniczenie nie dlaUIBarButtonItem
, ale dla elementów w nim zawartych .źródło
Dziękujemy wszystkim za wkład! macie rację !. dla xcode9 ios11 musisz umieścić ograniczenie.
źródło
translatesAutoresizingMaskIntoConstraints
a później dowiedziałem się, że iOS 9 całkowicie się zepsuł (ale wyglądał dobrze na iOS 10 i 11)Value of type 'UIBarButtonItem' has no member 'widthAnchor'
w Xcode 9 wewnątrzif #available(iOS 11.0, *)
warunku?Kod celu C jest teraz przestarzały. Ale dla użytkownika, który musi budować / utrzymywać projekty Objective C w iOS 11, pomocne jest tłumaczenie z języka Swift (odpowiedź Karoly Nyisztor) na Objective C.
źródło
Cóż, nowy
barButtonItem
używa autoukładu zamiast zajmować się ramkami.Obraz, który dodawałeś do przycisku, jest większy niż sam rozmiar przycisku. Dlatego sam przycisk został rozciągnięty do rozmiaru obrazu. Musisz zmienić rozmiar obrazu, aby pasował do wymaganego rozmiaru przycisku, przed dodaniem go do przycisku.
źródło
Napisałem małe rozszerzenie do ustawiania ograniczeń dla elementów paska nawigacyjnego:
źródło
UIButton
działa bardzo dobrze.Zrobiłem to obiektywnie, używając następujących linii:
Dzięki Miłego kodowania!
źródło
Co ja zrobiłem?
W mojej aplikacji dodałem zdjęcie profilowe na navigationBar w pozycji rightBarButton. przed iOS 11 działał dobrze i wyświetlał się poprawnie, ale po aktualizacji do iOS 11 zmień zachowanie, takie jak cios
Więc dodałem
UIView
element prawego przycisku i ustawiłemUIButton
jako podwidokUIView
? Jak poniżej,I ustawiam ograniczenia wysokości i szerokości na
UIButton
.I mój problem został rozwiązany. Nie zapomnij ustawić
UIView
koloru tła na czysty kolor.źródło
Zmiana
widthAnchor
/heightAnchor
będzie działać tylko na urządzeniach z systemem iOS 11+. W przypadku urządzeń z systemem iOS 10 musisz przejść klasyczny sposób ręcznej zmiany ramek. Chodzi o to, że żadne z dwóch podejść nie działa dla obu wersji, więc absolutnie musisz programowo zmieniać w zależności od wersji środowiska uruchomieniowego, jak poniżej:źródło
Mimo że iOS 11 używa Autolayout dla paska nawigacji, możliwe jest, aby działał tradycyjnie ustawiając ramki. Oto mój kod działający dla ios11 i ios10 lub starszych:
a oto jak składa się element paska:
źródło
Stawianie ograniczeń programowo działało dla mnie na użytkowników korzystających z iOS 11.X. Jednak przycisk paska był nadal rozciągnięty dla użytkowników korzystających z iOS 10.X. Wydaje mi się, że recenzenci AppStore używali iOS 11.X, więc nie mogli zidentyfikować mojego problemu, więc moja aplikacja była gotowa do sprzedaży i przesłana.
Moim rozwiązaniem była po prostu zmiana wymiarów mojego obrazu na 30x30 w innym programie (poprzedni wymiar obrazu to 120x120).
źródło
Odniosłem również sukces, wdrażając
intrinsicContentSize
zwracanie odpowiedniego rozmiaru dla dowolnej niestandardowej podklasy UIView, której zamierzam użyć jako niestandardowego widoku.źródło
Utworzyłem przycisk paska, a następnie dodałem go do paska nawigacji.
W widokuDidLoad ()
Tutaj mam obraz 28x28.
źródło