Este código funciona bien en ios10. obtengo mi etiqueta y un botón de imagen que es el perfil de la foto del usuario, circular, redondo .. ok. pero cuando ejecuto el simulador xcode 9 ios11 lo tengo extendido. el marco del botón tiene que ser 32x32, cuando verifico el sim y obtengo la vista y le digo a xcode que describa la vista, obtengo la salida como 170x32 o algo así.
aquí está mi código.
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
interiorUIBarButtonItem
, usebutton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: -20)
Respuestas:
Razón
El problema aparece porque desde ios 11 se
UIBarButtonItem
usa autolayout en lugar de lidiar con frames.Solución
Debe agregar una restricción de ancho para este botón de imagen si usa Xcode 9.
PD
button
no estáUIBarButtonItem
, estáUIButton
adentroUIBarButtonItem
. Debe establecer restricciones noUIBarButtonItem
para los elementos dentro de ella, sino para ella.fuente
¡Gracias a todos por contribuir! ustedes tienen razón !. para xcode9 ios11 necesitas poner una restricción.
fuente
translatesAutoresizingMaskIntoConstraints
y luego descubrí que iOS 9 se rompió por completo (pero se veía bien en iOS 10 y 11)Value of type 'UIBarButtonItem' has no member 'widthAnchor'
en Xcode 9 dentro de unif #available(iOS 11.0, *)
condicional?El código de Objective C está obsoleto ahora. Pero para el usuario que tiene que construir / mantener proyectos de Objective C en iOS 11, la siguiente traducción de Swift (respuesta de Karoly Nyisztor) a Objective C es útil.
fuente
Bueno, el nuevo
barButtonItem
usa el diseño automático en lugar de tratar con marcos.La imagen que estaba agregando al botón es más grande que el tamaño del botón en sí. Es por eso que el botón en sí se estiró al tamaño de la imagen. Debe cambiar el tamaño de la imagen para que coincida con el tamaño del botón necesario, antes de agregarlo al botón.
fuente
Escribí una pequeña extensión para establecer las restricciones en los elementos de la barra de navegación:
fuente
UIButton
funciona muy bien.Hice esto en objetivo usando las siguientes líneas:
Gracias codificación feliz !!
fuente
¿Lo que hice?
En mi aplicación, agregué la imagen de perfil en navigationBar en el elemento rightBarButton. antes de iOS 11 funcionaba bien y se mostraba correctamente, pero cuando se actualiza a iOS 11, cambia el comportamiento como golpe
Entonces agregué
UIView
el elemento del botón derecho y lo configuréUIButton
como una subvista deUIView
? Como abajo,Y establezco restricciones de altura y ancho de
UIButton
.Y mi problema está resuelto. No olvide configurar
UIView
el color de fondo como un color claro .fuente
Cambiar el
widthAnchor
/heightAnchor
solo funcionará en dispositivos iOS 11+. Para los dispositivos iOS 10, debe seguir la forma clásica de cambiar manualmente los marcos. El problema es que ninguno de los dos enfoques funciona para ambas versiones, por lo que es absolutamente necesario alternar programáticamente según la versión en tiempo de ejecución, como se muestra a continuación:fuente
Aunque iOS 11 usa Autolayout para la barra de navegación, es posible hacer que funcione estableciendo marcos de manera tradicional. Aquí está mi código que funciona para ios11 e ios10 o anteriores:
y así es como se compone el elemento de la barra:
fuente
Poner restricciones mediante programación me funcionó para los usuarios que ejecutan iOS 11.X. Sin embargo, el botón de la barra todavía estaba estirado para los usuarios que ejecutaban iOS 10.X. Supongo que los revisores de la AppStore ejecutaban iOS 11.X, por lo que no pudieron identificar mi problema, por lo que mi aplicación se preparó para la venta y se cargó ...
Mi solución fue simplemente cambiar las dimensiones de mi imagen a 30x30 en otro software (la dimensión de la imagen anterior era 120x120).
fuente
También tuve éxito al implementar
intrinsicContentSize
para devolver un tamaño apropiado para cualquier subclase de UIView personalizada que pretendo usar como customView.fuente
He creado un elemento de botón de barra y luego lo agregué a la barra de navegación.
En viewDidLoad ()
Aquí tengo la imagen de 28x28.
fuente