Este código funciona bem no ios10. recebo minha etiqueta e um botão de imagem que é o perfil da foto do usuário, redondo .. ok. mas ao executar o simulador ios11 do xcode 9, consigo esticá-lo. o quadro do botão deve ser 32x32, ao verificar o sim e obter a visualização e dizer ao xcode para descrever a visualização, recebo a saída como 170x32 ou algo assim.
aqui está meu 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)
Respostas:
Razão
O problema aparece porque o ios 11
UIBarButtonItem
usa autolayout em vez de lidar com frames.Solução
Você deve adicionar uma restrição de largura para este botão de imagem se usar o Xcode 9.
PS
button
não estáUIBarButtonItem
, estáUIButton
dentroUIBarButtonItem
. Você deve definir a restrição não paraUIBarButtonItem
, mas para os elementos dentro dela.fonte
Obrigado a todos por contribuir! vocês estão certos !. para xcode9 ios11 você precisa colocar uma restrição.
fonte
translatesAutoresizingMaskIntoConstraints
e depois descobri que estava totalmente quebrado no iOS 9 (mas parecia bem no iOS 10 e 11)Value of type 'UIBarButtonItem' has no member 'widthAnchor'
no Xcode 9 dentro de umif #available(iOS 11.0, *)
condicional?O código Objective C está obsoleto agora. Mas para o usuário que precisa construir / manter projetos Objective C no iOS 11, a tradução a seguir de Swift (resposta de Karoly Nyisztor) para Objective C é útil.
fonte
Bem, o novo
barButtonItem
usa autolayout em vez de lidar com frames.A imagem que você estava adicionando ao botão é maior do que o tamanho do botão em si. É por isso que o próprio botão foi esticado para o tamanho da imagem. Você deve redimensionar a imagem para corresponder ao tamanho do botão necessário, antes de adicioná-la ao botão.
fonte
Eu escrevi uma pequena extensão para definir as restrições nos itens da barra de navegação:
fonte
UIButton
funciona muito bem.Eu fiz isso objetivamente usando as seguintes linhas:
Obrigado, feliz codificação !!
fonte
O que eu fiz?
No meu aplicativo, adicionei a imagem do perfil na NavigationBar no item rightBarButton. antes do iOS 11, ele funcionava bem e era exibido corretamente, mas quando atualizado para o iOS 11, mudava o comportamento como um golpe
Então adicionei
UIView
o item do botão direito e definiUIButton
como subvisualização deUIView
? Como abaixo,E eu defini as restrições de altura e largura de
UIButton
.E meu problema está resolvido. Não se esqueça de definir
UIView
a cor de fundo de como uma cor clara .fonte
Alterando o
widthAnchor
/heightAnchor
funcionará apenas em dispositivos iOS 11+. Para dispositivos iOS 10, você precisa seguir o caminho clássico de alterar manualmente os quadros. O fato é que nenhuma das duas abordagens funciona para as duas versões, então você absolutamente precisa alternar programaticamente dependendo da versão do tempo de execução, como abaixo:fonte
Mesmo que o iOS 11 use o Autolayout para a barra de navegação, é possível fazê-lo funcionar tradicionalmente configurando frames. Aqui está meu código funcionando para ios11 e ios10 ou mais antigo:
e aqui está como o item da barra é composto:
fonte
Colocar restrições de maneira programática funcionou para mim para usuários que executam iOS 11.X. No entanto, o botão da barra ainda estava esticado para usuários que executam iOS 10.X.Acho que os revisores da AppStore estavam executando o iOS 11.X, portanto, não puderam identificar meu problema, então meu aplicativo ficou pronto para venda e foi carregado.
Minha solução foi simplesmente mudar as dimensões da minha imagem para 30x30 em outro software (a dimensão da imagem anterior era 120x120).
fonte
Também tive sucesso implementando
intrinsicContentSize
para retornar um tamanho apropriado para qualquer subclasse UIView personalizada que pretendo usar como um customView.fonte
Eu criei um item de botão da barra e o adicionei à barra de navegação.
Em viewDidLoad ()
Aqui estou tendo a imagem de 28x28.
fonte