Tenho um retângulo arredondado e desejo mascarar as partes esquerda e direita dele (cujas larguras podem ser definidas como State
variáveis). O que eu quero é que o retângulo arredondado preserve seu formato de retângulo arredondado conforme aplico máscaras esquerda e direita. Digo máscara para fins de explicação, mas a implementação real pode não usar .mask
o modificador se criar problemas no teste de acerto para reconhecedores de gestos em toda a visualização.
Aqui está o código para mascarar as partes esquerda e direita de um retângulo arredondado.
struct MaskTesting: View {
@State var rectWidth:CGFloat = 300
@State var leftMaskWidth:CGFloat = 100
@State var rightMaskWidth:CGFloat = 100
var body: some View {
Rectangle()
.fill(Color.orange)
.frame(maxHeight:70)
.frame(width: rectWidth)
.clipShape(RoundedRectangle(cornerRadius: 5))
.overlay(alignment: .leading) {
Rectangle()
.fill(Color.purple)
.frame(maxHeight:70)
.frame(width: leftMaskWidth)
}
.overlay(alignment: .leading) {
Rectangle()
.fill(Color.purple)
.frame(maxHeight:70)
.frame(width: rightMaskWidth)
.offset(x:rectWidth - 100)
}
}
A saída é algo como isto. Mas eu quero que a visualização laranja principal seja um retângulo arredondado do que um retângulo simples na saída. Como eu implemento isso no SwiftUI?
Uma
RoundedRectangle
máscara pareceria a solução mais óbvia:No entanto, você diz que isso não é possível, porque não funciona para testes de acerto. Então, aqui estão duas outras técnicas possíveis.
1. Usar
.blendMode
O efeito de uma máscara também pode ser alcançado usando
.blendMode
. Em particular, o modo de mesclagem.destinationOut
pode ser usado para "cortar" uma forma de uma visualização subjacente. O "escopo" do modo de mesclagem precisa ser restringido aplicando.compositingGroup
, caso contrário, ele continua queimando em camadas inferiores:2. Use um
Shape
formato de clipe personalizadoUma abordagem alternativa é definir um
Shape
formato personalizado, que pode então ser usado como clipe:O resultado parece o mesmo de antes.
Em relação ao teste de acerto, a área receptiva ao teste de acerto pode ser restringida definindo a mesma forma que
.contentShape
:Se essas técnicas não resolverem o problema do teste de acerto, talvez você possa elaborar mais sobre qual é exatamente o problema, para que ele possa ser abordado como o problema principal.