ios - Hoje, a altura da extensão para o iPad é muito maior do que o especificado




ios8 autolayout (2)

A extensão My Today precisa ter uma altura dinâmica com base no conteúdo que o widget está exibindo. Consegui fazer isso adicionando uma restrição no meu elemento mais inferior: a parte superior do guia de layout inferior é menor ou igual à parte inferior do elemento mais, com uma constante de 0, prioridade 999, multiplicador 1.

Isso funciona exatamente como o esperado nos iPhones - a altura do widget se encaixa em todo o conteúdo, mais a margem inferior padrão é aplicada antes que o próximo widget seja exibido.

Porém, no iPad, parece que a altura do meu widget é igual à altura máxima do Centro de Notificações, permitindo que um widget seja - há muito espaço embaixo do meu widget, é quase a tela inteira.

Como posso remover esse espaço extra?

Sei exatamente qual é o problema, mas não sei como resolvê-lo - consulte a seção "O problema". Primeiro, deixe-me explicar a configuração:

A instalação:
Eu configurei a visualização dessa extensão em um storyboard, nada é feito programaticamente. A visualização consiste em 5 elementos empilhados verticalmente e outros horizontalmente. Essas são as restrições de layout automático para essa linha vertical de cima para baixo - onde a prioridade não declarada é 1000, multiplicador 1:

UILabel: height = 35, top space to top layout guide with constant of 10
UIButton: equal height and width to a different button (whose aspect ratio is 1:1, there is no fixed width/height), top space to label 10
UIButton: equal height and width to same button, top space to above button 8
UIButton: equal height and width to same button, top space to above button 8
UIButton: equal height and width to same button, top space to above button 8, bottom space to bottom layout guide <= 0 with priority 999

O comportamento necessário:

  • Preciso de uma grade de botões 4x4 localizados sob um único rótulo de largura total
  • Cada botão deve ter exatamente a mesma largura e altura - todos os quadrados perfeitos
  • Não há espaço extra embaixo da última linha de botões

O resultado:

O resultado esperado:

O problema:
As restrições de proporção em todos os botões acabam impondo indiretamente uma restrição de proporção 'implícita' na altura da visualização do widget quando é enviada systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority: em que passou a largura necessária (724) para o layout em a prioridade necessária e uma altura de 0 (para compactar a vista) na prioridade do nível de ajuste. Isso resulta em uma visualização alta do widget no iPad, onde a visualização é mais ampla, para começar. Mas não há nenhuma restrição real de proporção que possa ser removida. Essencialmente, como eu apliquei restrições de proporção a todos os botões, a altura da extensão atual depende da sua largura (considerando todas as restrições juntas, proporção e outras). Assim, a altura da extensão é desagradável em uma área ampla, manifestando-se em um dispositivo amplo como o iPad. As restrições nos botões precisam ser reconsideradas ou ajustadas de alguma forma.

O projeto de amostra:
Um projeto de amostra que demonstra o problema está disponível no CloudApp para que você possa fazer o download e jogar com ele.

O que eu tentei:
Tentei remover as inserções de margem padrão substituindo widgetMarginInsetsForProposedMarginInsets e retornando 0 para a parte inferior. Isso removeu o preenchimento padrão e, portanto, diminuiu um pouco a altura, mas ainda há muito espaço extra embaixo dele.

O UILabel tinha uma restrição: a liderança da etiqueta é igual à liderança da superview - constante 0, prioridade 1000, multiplicador 1. Se eu simplesmente mudar isso para a margem principal da superview, o espaçamento extra inferior desaparece magicamente. Gostaria de saber se era porque os elementos estavam se tornando muito grandes, aumentando assim a quantidade de espaçamento esquerdo diminuiria seu tamanho, mas tentei mantê-lo na liderança regular e aumentar a constante e isso não resolveu o problema. Mas isso só resolve o problema do iPad em retrato. E nem o resolve completamente, toda vez que você puxa para baixo o Notification Center, ele começa na altura grande e depois diminui para o tamanho adequado. Na paisagem, nunca diminui para o tamanho adequado.

Tentativas de soluções:

  • A @Lefteris propôs codificar o tamanho, que não funcionará nesse caso, pois a altura é dinâmica e o widget está disponível para muitos tamanhos / orientações de tela.
  • O @Yuyutsu tentou resolvê-lo, mas infelizmente não atende aos requisitos e apresenta restrições conflitantes e um layout modificado.

Eu estava enfrentando o mesmo problema. Você adicionou uma restrição de preenchimento inferior, como mostrado na imagem?

Isso funcionou para mim. Espero que ajude


Eu tive que codificar o valor do widget no método delegado viewDidLoad para corrigir isso:

import UIKit
import NotificationCenter

class TodayViewController: UIViewController, NCWidgetProviding {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.preferredContentSize = CGSize(width: 0, height: 320)
    }

}






ios8-today-widget