Eu tenho um UIView
que tem cerca de 8 CALayer
subcamadas diferentes adicionadas à sua camada. Se eu modificar os limites da visualização (animados), a visualização em si encolhe (marquei com a backgroundColor
), mas o tamanho das subcamadas permanece o mesmo .
Como resolver isso?
UITextView
automático (scrollEnabled = NO) e layout automático. Eu tinha uma visualização de texto fixada em sua supervisão, que por sua vez tinha umCALayer
na parte inferior de si mesma (uma borda), e queria atualizar a posição da borda quando a altura da visualização de texto mudasse. Por algum motivo,layoutSubiews
foi chamado tarde demais (e a posição da camada foi animada).Como CALayer no iPhone não oferece suporte a gerenciadores de layout, acho que você deve tornar a camada principal de sua visualização uma subclasse CALayer personalizada na qual você sobrescreve
layoutSublayers
para definir os quadros de todas as subcamadas. Você também deve substituir o+layerClass
método de sua visão para retornar a classe de sua nova subclasse CALayer.fonte
Usei isso no UIView.
Funciona para mim.
fonte
CALayerDelegate
sdraw(_:in:)
) personalizado ( s ), tive que chamar também_anySubLayer.setNeedsDisplay()
. Então isso funcionou para mim.Eu tive o mesmo problema. Na camada de uma visualização personalizada, adicionei mais duas subcamadas. Para redimensionar as subcamadas (toda vez que os limites da visualização personalizada mudam), implementei o método
layoutSubviews
da minha visualização personalizada; dentro desse método, eu apenas atualizo o quadro de cada subcamada para corresponder aos limites atuais da camada da minha subvisualização.Algo assim:
fonte
2017
A resposta literal a esta pergunta:
"CALayers não foram redimensionados com a alteração dos limites do UIView. Por quê?"
isso é para melhor ou para pior
needsDisplayOnBoundsChange
o padrão é falso em
CALayer
.solução,
Na verdade, eu direciono você para este controle de qualidade
https://stackoverflow.com/a/47760444/294884
o que explica o que diabos o
contentsScale
cenário crítico faz; você geralmente precisa definir isso igualmente ao definir needsDisplayOnBoundsChange.fonte
Versão Swift 3
Na célula personalizada, adicione as seguintes linhas
Declare primeiro
Em seguida, adicione as seguintes linhas
fonte
Como [Ole] escreveu, CALayer não oferece suporte a redimensionamento automático no iOS. Portanto, você deve ajustar o layout manualmente. Minha opção era ajustar o quadro da camada dentro (iOS 7 e anterior)
ou (a partir do iOS 8)
fonte
Em sua visualização personalizada, você precisa declarar a variável para sua camada personalizada, não declare a variável no init do escopo. E apenas inicie uma vez, não tente definir um valor nulo e reinicie
fonte