Jeśli to powinien działać na wszystkich UISegmentedControls to trochę kłopotów. Problem dotyczy iOS7 1 pt. granica między dwoma segmentami nie liczy się z rozmiarem segmentu. Na przykład. jeśli rama twojego UISegmentedControl wynosi 320 pt. szeroki musisz usunąć 1 pt. a następnie podzielić przez 2. A (320-1)/2 to 159,5. System iOS stosuje tę wartość do 159 punktów. I kończysz z 1 pkt. granica i dwie 159 pt. segmenty. Który jest 319, a nie 320. Stąd 1pt. linia po prawej stronie segmentedControl.
Istnieje sposób obliczania "rzeczywistego" (rozmiar renderowania na ekranie) rozmiaru segmentedControl. Dzięki tej szerokości możesz dodać UIView z zaokrąglonymi narożnikami poniżej UISegmentedControl. Kod ten powinien działać na wszystkich konfiguracjach, nawet jeśli trzeba ręcznie wielkości segmenty w segmentedControl:
- (UIView *)addBackgroundViewBelowSegmentedControl:(UISegmentedControl *)segmentedControl {
CGFloat autosizedWidth = CGRectGetWidth(segmentedControl.bounds);
autosizedWidth -= (segmentedControl.numberOfSegments - 1); // ignore the 1pt. borders between segments
NSInteger numberOfAutosizedSegmentes = 0;
NSMutableArray *segmentWidths = [NSMutableArray arrayWithCapacity:segmentedControl.numberOfSegments];
for (NSInteger i = 0; i < segmentedControl.numberOfSegments; i++) {
CGFloat width = [segmentedControl widthForSegmentAtIndex:i];
if (width == 0.0f) {
// auto sized
numberOfAutosizedSegmentes++;
[segmentWidths addObject:[NSNull null]];
}
else {
// manually sized
autosizedWidth -= width;
[segmentWidths addObject:@(width)];
}
}
CGFloat autoWidth = floorf(autosizedWidth/(float)numberOfAutosizedSegmentes);
CGFloat realWidth = (segmentedControl.numberOfSegments-1); // add all the 1pt. borders between the segments
for (NSInteger i = 0; i < [segmentWidths count]; i++) {
id width = segmentWidths[i];
if (width == [NSNull null]) {
realWidth += autoWidth;
}
else {
realWidth += [width floatValue];
}
}
CGRect whiteViewFrame = segmentedControl.frame;
whiteViewFrame.size.width = realWidth;
UIView *whiteView = [[UIView alloc] initWithFrame:whiteViewFrame];
whiteView.backgroundColor = [UIColor whiteColor];
whiteView.layer.cornerRadius = 5.0f;
[self.view insertSubview:whiteView belowSubview:segmentedControl];
return whiteView;
}
Proszę dbać ramki zmienia się.
Zobacz ten zrzut ekranu, aby zobaczyć różnicę między dwoma elementami sterującymi. Wszystkie ramki mają 280 pt. szeroki.
Ze względu na formułę UISegmentedControl używa pierwszych kontrolek, rzeczywisty rozmiar to 278 pt. A rzeczywista wielkość drugiego to 279 pt.

Problemem jest to, że w jakiś sposób polega na realizacji UISegmentedControl. Apple może na przykład zmienić implementację, tak aby segmentWidth, który kończy się na .5 punktach, zostanie wyświetlony. Mogli to łatwo zrobić na wyświetlaczach Retina.
Jeśli używasz tego kodu, powinieneś jak najszybciej sprawdzić swoją aplikację na nowych wersjach systemu iOS. Opieramy się na szczegółach wdrożenia, a te mogą się zmieniać każdego dnia. Na szczęście nic się nie dzieje, jeśli zmieniają implementację. Po prostu nie będzie dobrze.
można ustawić 'segmented.backgroundColor = [UIColor clearColor];' –
@Viruss MCA: Dziękuję za komentarz, ale w tym przypadku, tło za "Tratad jako "jest pokazane na szaro, a nie na biało. – neutrino
Możesz również użyć dwóch UIButtons zamiast UISegmentedControl jako alternatywnego rozwiązania. – Engnyl