Core Graphics nie rysuje linii o prawidłowej szerokości
Próbuję połączyć obramowanie na UIView z linią narysowaną w drawRect. Używam obu tych samych szerokości. Ale problem polega na tym, że czasem wynikowa szerokość narysowanych linii jest taka sama dla obu, a czasem nie - to nawet zmienia się wraz z orientacją urządzenia! Ale nawet bez zmiany orientacji urządzenia na ogół nie ma tej samej szerokości.
Granica jest rysowana za pomocą:
<code>view.layer.borderColor = [UIColor blackColor].CGColor; view.layer.borderWidth = 1.0f; </code>
Powyżej tego widoku znajduje się inny widok, który jest podklasą UIView. Oba widoki mają tę samą szerokość i ten drugi widok obejmuje górną część widoku. Widok obejmujący używa następującego kodu w drawRect, aby narysować linię po lewej stronie, która powinna być idealnie dopasowana do granicy powyższego widoku poniżej:
<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>
Jakieś pomysły, jak można to osiągnąć? W tej chwili, nawet jeśli szerokość jest zawsze równa 1.0f, jest to zbieg okoliczności, jeśli obie linie są narysowane z taką samą widoczną szerokością.
Celem jest uzyskanie czegoś, co wygląda jak widok z zaokrąglonymi narożnikami na dole, ale zwykłe krawędzie na górze. Dlatego to robię. Pierwszy widok ma zaokrąglone narożniki, a drugi widok powyżej dopasowuje go do szerokości, ale pokrywa górną część, więc zaokrąglone narożniki na górze nie są widoczne.
Zrzut ekranu w portrecie:
Zrzut ekranu w krajobrazie:
Żółty widok znajduje się nad białym widokiem. Czarne linie białego widoku są rysowane w wyniku view.layer.borderWidth = 1.0f. Czarne linie po lewej i prawej stronie żółtego widoku są rysowane w trybie remisu z powyższym kodem. Zmiany orientacji powodują przerysowanie, ale sam kod rysunku pozostaje taki sam. Oba zrzuty ekranu pochodzą z iPhone'a z wyświetlaczem Retina (iPhone 4S).
O ile mogę powiedzieć, wszystkie wartości są „liczbami całkowitymi”:
<code>x: 0.000000, y: 0.000000 width: 264.000000, height: 10.000000 frame.origin.x: 33.000000, frame.origin.y: 38.000000 </code>