Core Graphics não está desenhando uma linha na largura correta
Eu estou tentando combinar uma borda em um UIView com uma linha desenhada em drawRect. Eu uso para ambos a mesma largura. Mas o problema é que, às vezes, a largura resultante das linhas desenhadas é a mesma para ambos e às vezes não - isso até muda com a orientação do dispositivo! Mas, mesmo sem alterar a orientação do dispositivo, ele ainda não tem a mesma largura.
A fronteira é desenhada com:
<code>view.layer.borderColor = [UIColor blackColor].CGColor; view.layer.borderWidth = 1.0f; </code>
Acima dessa visão é outra visão, que é uma subclasse do UIView. Ambas as vistas têm a mesma largura e esta segunda vista cobre o topo da vista acima. A exibição de cobertura usa o código a seguir em drawRect para desenhar uma linha à esquerda, que deve alinhar perfeitamente com a borda da visualização acima abaixo dela:
<code>CGContextRef context = UIGraphicsGetCurrentContext(); CGFloat x = self.bounds.origin.x; CGFloat y = self.bounds.origin.y; CGFloat width = self.bounds.size.width; CGFloat height = self.bounds.size.height; CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor); CGContextSetLineWidth(context, 1.0f); // Left line CGContextMoveToPoint(context, x, y); CGContextAddLineToPoint(context, x, height); CGContextStrokePath(context); // Right line CGContextMoveToPoint(context, width - 1.0f, y); CGContextAddLineToPoint(context, width - 1.0f, height); CGContextStrokePath(context); </code>
Alguma idéia de como isso pode ser alcançado? No momento, mesmo que a largura seja sempre 1.0f, é apenas coincidência se ambas as linhas forem desenhadas com a mesma largura visível.
O objetivo é acabar com algo que parece uma visão com cantos arredondados na parte inferior, mas bordas usuais na parte superior. É por isso que estou fazendo isso. A primeira vista tem os cantos arredondados e a segunda vista acima combina com a largura, mas cobre a parte superior, portanto as cornes arredondadas na parte superior não são visíveis.
Captura de tela no retrato:
Captura de tela na paisagem:
A vista amarela está acima da vista branca. As linhas pretas da vista branca são desenhadas como resultado de view.layer.borderWidth = 1.0f. As linhas pretas à esquerda e à direita da vista amarela são desenhadas em drawRect com o código acima. Mudanças de orientação desencadeiam um redesenho, mas o próprio código de desenho permanece o mesmo. Ambas as capturas de tela são de um iPhone com tela de retina (iPhone 4S).
Tanto quanto eu posso dizer todos os valores são "inteiros":
<code>x: 0.000000, y: 0.000000 width: 264.000000, height: 10.000000 frame.origin.x: 33.000000, frame.origin.y: 38.000000 </code>