Como alterar a altura UIPickerView
É possível alterar a altura do UIPickerView? Alguns aplicativos parecem ter PickerViews mais curtos, mas a configuração de um quadro menor não parece funcionar e o quadro está bloqueado no Interface Builder.
Respostas adicionais podem ser encontradas em uma pergunta semelhante: como reduzir a visualização do seletor no iPhone? .
Parece óbvio que a Apple não convida particularmente a limpeza com a altura padrão do UIPickerView, mas descobri que você pode conseguir uma mudança na altura da visualização assumindo o controle total e passando um tamanho de quadro desejado no momento da criação, por exemplo:
Você descobrirá que, em várias alturas e larguras, existem falhas visuais. Obviamente, essas falhas precisariam ser contornadas de alguma forma ou escolher outro tamanho que não as exibisse.
— danielpunkass
Isso funciona para você? Todos os UIPickerViews que instancio parecem estar bloqueados a uma altura de 215 ...
— Andy Bourassa
Funciona para mim. Você está especificando a altura reduzida no método initWithFrame, como descrevi? Eles tendem a lutar para permanecer em certa altura, mas depois que inicializei com um quadro curto, funcionou. Se você ainda não consegue fazer funcionar, vou ver se consigo um trecho de amostra.
— danielpunkass,
Existe algum controle de terceiros que permite o redimensionamento?
— cfischer de
Isso funcionou. 4.3. Eu inicio com frame e setframe antes da primeira aparição.
— griotspeak
Eu estava preso nisso por um tempo. É IMPORTANTE notar que você DEVE inicializar com frame ou setframe antes da primeira aparição ou você obterá falhas visuais.
— w.donahue
Nenhuma das abordagens acima funciona no iOS 4.0
A altura do pickerView não é mais redimensionável. Há uma mensagem que é descarregada para o console se você tentar alterar o quadro de um seletor no 4.0:
Acabei fazendo algo bastante radical para obter o efeito de um seletor menor que funciona tanto no OS 3.xx quanto no OS 4.0. Deixei o seletor com o tamanho que o SDK decidir que deveria ter e, em vez disso, criei uma janela transparente cortada em minha imagem de plano de fundo por meio da qual o seletor se torna visível. Em seguida, basta colocar o seletor atrás (na ordem Z) de meu plano de fundo UIImageView para que apenas uma parte do seletor seja visível, o que é ditado pela janela transparente em meu plano de fundo.
Existem apenas três alturas válidas para UIPickerView (162.0, 180.0 and 216.0).
Você pode usar as funções CGAffineTransformMakeTranslatione CGAffineTransformMakeScalepara ajustar o seletor de acordo com sua conveniência.
O código acima altera a altura da visualização do seletor para a metade e a reposiciona na posição exata (Left-x1, Top-y1) .
— JRSee
Ótima resposta. Apenas uma nota que para alterar a altura do seletor você não precisa usar tradução: pickerview.transform = CGAffineTransformMakeScale (1.0, 0.5);
— Borzh 01 de
Obrigado. Parece verdade, mas há alguma documentação da Apple sobre as alturas válidas?
— vijay adhikari
Eu sei que estou atrasado para a festa aqui - e talvez existam métodos melhores para fazer isso agora, mas funcionou para mim.
Funciona bem! Para Swift (iOS 10) é: statePicker.transform = CGAffineTransform (scaleX: 0.8, y: 0.8)
— Meshach
No iOS 4.2 e 4.3 funciona o seguinte:
Eu tenho um aplicativo que está na app store com um selecionador de data de 3 linhas. Achei que a alteração da altura pode ter sido evitada porque você vê o texto sob a borda do selecionador de data, mas isso também acontece com o selecionador de data de altura 216 normal.
Qual é o bug? Seu palpite é tão bom quanto o meu.
Além disso, existem 3 alturas válidas para UIDatePicker(e UIPickerView) 162,0, 180,0 e 216,0. Se você definir uma UIPickerViewaltura para qualquer outra coisa, verá o seguinte no console ao depurar em um dispositivo iOS.
No iOS 9, você pode alterar livremente UIPickerViewa largura e a altura. Não há necessidade de usar os hacks de transformação mencionados acima.
— rounak
precisa determinar como adicionar um inputAccessoryView a um UIPickerView de tamanho aumentado.
— DogCoffee,
Importa-se de compartilhar como?
— inmanl
Descobri que você pode editar o tamanho do UIPickerView - mas não com o construtor de interface. abra o arquivo .xib com um editor de texto e defina o tamanho da visualização do selecionador para o que quiser. O construtor de interface não redefine o tamanho e parece funcionar. Tenho certeza que a apple travou o tamanho por uma razão, então você terá que experimentar diferentes tamanhos para ver o que funciona.
Faz com que setFrame UIPickerViewse comporte como deveria
Nenhum código de transformação em seu UIViewController
Trabalha viewWillLayoutSubviewsinternamente para redimensionar / posicionar oUIPickerView
Funciona no iPad sem UIPopover
A superclasse sempre recebe uma altura válida
Funciona com iOS 5
Requer que você subclasse UIPickerView
Requer o uso de pickerView viewForRowpara desfazer a transformação para as subViews
UIAnimations pode não funcionar
Subclasse UIPickerView e substitua os dois métodos usando o código a seguir. Ele combina subclasses, altura fixa e abordagem de transformação.
— HeikoG
Uma maneira fácil de alterar a altura visível de uma visualização do seletor é incorporar o seletor em um UIView, ajustar a altura da visualização pai para a altura que você deseja ver do seletor e, em seguida, habilitar "Clip Subviews" no Interface Builder no UIView principal ou definido view.clipsToBounds = trueem código.
— Svarrall
você pode confirmar se isso realmente funciona? No xcode parece que sim, mas rodando no dispositivo está mostrando a pickerview sobre aquela uiview
— nhenrique
Funciona @nhenrique, mas você não deve esquecer Clip Subviews. também o tamanho do UIPickerViewdeve ser mais alto - e você deve apontar o centro do seu UIPickerViewpara ser visível dentro do paiUIView
— new2ios
Boa ideia, essa foi a solução para mim no iOS 7.1.
Isso não está funcionando, @ new2ios, você pode confirmar que está funcionando no iOS8>? Estou tentando fazer a mesma coisa programaticamente.
Desculpe, @hagile, mas abandono essa ideia - não posso confirmar. Eu uso o Storyboard (não criado a UIPickerViewpartir do código).
Não fui capaz de seguir nenhum dos conselhos acima.
Assisti a vários tutoriais e achei este o mais benéfico:
Eu adicionei o código a seguir para definir a nova altura dentro do método "viewDidLoad", que funcionou em meu aplicativo.
— errante
Isso mudou muito no iOS 9 (no iOS 8 é muito semelhante ao que estamos vendo aqui). Se você puder ter como alvo apenas o iOS 9, poderá redimensionar o UIPickerViewconforme achar necessário, definindo seu quadro. Boa!
Aqui está das notas de lançamento do iOS 9
UIPickerView e UIDatePicker agora são redimensionáveis ​​e adaptáveis ​​- anteriormente, essas visualizações impunham um tamanho padrão, mesmo se você tentasse redimensioná-las. Essas visualizações agora também têm uma largura padrão de 320 pontos em todos os dispositivos, em vez da largura do dispositivo no iPhone.
As interfaces que dependem da aplicação antiga do tamanho padrão provavelmente parecerão erradas quando compiladas para iOS 9. Quaisquer problemas encontrados podem ser resolvidos restringindo ou dimensionando totalmente as visualizações do seletor para o tamanho desejado em vez de depender do comportamento implícito.
Estou trabalhando com ios 7, Xcode 5. Consegui ajustar a altura do seletor de data indiretamente, incluindo-o em uma visualização. A altura das visualizações do contêiner pode ser ajustada.
Isso funcionou desde que eu o executei no ios 7. Quando executo essa mesma compilação no ios 6, o seletor inteiro aparece, esperando por partes que são substituídas por outras visualizações. Contanto que você almeje apenas> = 7, isso pode ser viável. Ordenar as visualizações de forma que o selecionador seja renderizado primeiro oculta efetivamente as partes periféricas, mas isso está apenas mascarando-as com outras visualizações.
— Doug Gerecht
Você pode explicar um pouco mais sobre como isso foi feito? Isso serve apenas para diminuir a visualização ou você também pode aumentar o seletor? Atualmente desenvolvendo um aplicativo iOS 7 para iPad e preciso que o seletor seja mais alto, mas não importa o que eu tente, não consigo aumentar o tamanho!
Crie uma visualização em IB ou código. Adicione seu seletor como uma subvisão desta visualização. Redimensione a visualização. Isso é mais fácil de fazer no IB. Crie restrições da visualização para sua supervisão e do selecionador para esta nova visualização.
Como o Seletor se curva ao redor, ele se espalha pela parte superior e inferior da visualização. Você pode ver em IB quando você adiciona restrições superior e inferior do seletor à visualização, ele mostra um espaço padrão algo como 16 pontos acima e abaixo do contêiner de visualização. Defina a visualização para recortá-lo se você não quiser esse comportamento (aviso feio).
Aqui está o que parece com 96 pontos de altura em um iPhone 5. O seletor com o spillover tem cerca de 130 pontos de altura. Muito magro!
Estou usando isso em meu projeto para evitar que o seletor se espalhe a uma altura desnecessária. Essa técnica reduz e força um derramamento mais rígido. Na verdade, parece mais elegante ser um pouco mais compacto.
Aqui está uma imagem da vista mostrando o spillover.
Aqui estão as restrições IB que adicionei.
Mesmo que não esteja redimensionando, outro truque pode ajudar na situação em que o UIPicker está localizado na parte inferior da tela.
Pode-se tentar movê-lo ligeiramente para baixo, mas a fileira central deve permanecer visível. Isso ajudará a revelar algum espaço acima do seletor, pois as linhas inferiores ficarão fora da tela.
Repito que esta não é a maneira de alterar a altura da visualização do UIPicker, mas uma ideia do que você pode fazer se todas as outras tentativas falharem.
— Sergey Lost
Ok, depois de lutar por um longo tempo com a estúpida visualização de seleção no iOS 4, decidi mudar meu controle para uma tabela simples: aqui está o código:
Aqui está o arquivo .h para isso:
é isso, agora a única coisa que resta é criar uma variável de membro na visão combobox que manterá a seleção de linha atual, e estamos prontos.
Aproveite todos.
aqui o que é VivatAwardsStruct, estou recebendo um erro aqui, VivatAwardsStruct não declarado
Geralmente você não pode fazer isso no xib ou definir o quadro programaticamente, mas se você abrir seu xib pai como fonte e alterar a altura a partir daí, então ele funciona. nessa tag, mude a altura lá e salve o arquivo.
— iosdev1111
Pelo que eu sei, é impossível reduzir o UIPickerView. Eu também não vi um menor usado em qualquer lugar. Meu palpite é que foi uma implementação customizada, se eles conseguiram reduzi-la.
— NilObject
Você pode redimensionar a visualização do uipick horizontalmente, mas se definir muito curto, isso causará falhas visuais.
Se você deseja criar seu seletor em IB, pode redimensioná-lo posteriormente para um tamanho menor. Verifique se ele ainda desenha corretamente, pois chega um ponto em que parece hediondo.
— Rob Winchester
Swift : você precisa adicionar uma subvisualização com clipe aos limites
Isso deve adicionar um seletor de data de altura 100 cortado na parte superior do controlador de visualização.
— Miika Pakarinen
Meu truque: usar a camada de máscara do datepicker para tornar o datePicker alguma parte visível. como você vê, assim como mudar a moldura do datepicke.
Eu uso uma camada de máscara para alterar o tamanho da tela
Incorporar em uma exibição de pilha. O modo de exibição de pilha é um componente adicionado recentemente pela Apple em seu iOS SDK para refletir implementações baseadas em grade em bibliotecas de front-end baseadas em java script, como bootstrap.
— user5590043
Conforme mencionado acima, UIPickerViewagora é redimensionável. Só quero acrescentar que, se você quiser alterar a altura do pickerView em uma célula tableView, não tive nenhum sucesso em definir a âncora de altura como uma constante. No entanto, o uso lessThanOrEqualToConstantparece funcionar.
class PickerViewCell: UITableViewCell {
// call this from however you initialize your cell
self.contentView.addSubview(self.pickerView)
self.pickerView.translatesAutoresizingMaskIntoConstraints = false
// pin the pickerView to the contentView's layoutMarginsGuide
self.pickerView.leadingAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.leadingAnchor),
self.pickerView.topAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.topAnchor),
self.pickerView.trailingAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.trailingAnchor),
self.pickerView.bottomAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.bottomAnchor),
// set the height using lessThanOrEqualToConstant
self.pickerView.heightAnchor.constraint(lessThanOrEqualToConstant: 100)
Depois de um longo dia coçando minha cabeça, descobri algo que funciona para mim. Os códigos abaixo recriarão o UIDatePicker toda vez que o usuário alterar a orientação do telefone. Isso removerá quaisquer falhas que o UIDatePicker tenha após uma mudança de orientação.
Como estamos recriando o UIDatePicker, precisamos de uma variável de instância que manterá o valor de data selecionado. Os códigos abaixo são testados no iOS 4.0.
— chromeragnarok
Se você deseja definir o tamanho de UiPickerView. O código acima certamente vai funcionar para você.
No iOS 5.0, fiz o seguinte funcionar:
Isso criou um selecionador de data como o que a Apple usa no aplicativo Agenda ao criar um novo evento no modo paisagem. (3 linhas de altura em vez de 5.) Isso não funcionou quando defini o quadro dentro do initWithFrame:método, mas até agora funcionou ao defini-lo usando um método separado.
se você der uma olhada rápida em UIPickerView Protocol Reference
Eu acho que é o primeiro que você está procurando
pickerView:rowHeightForComponent:é o método delegado para decidir a altura de cada linha - não a altura da visualização do selecionador.