Wenn das für alle UISegmentedControls funktionieren sollte, es ist ein bisschen umständlich. Das Problem ist in iOS7 der 1 pt. Grenze zwischen zwei Segmenten zählt nicht zur Größe des Segments. Z.B. Wenn der Rahmen Ihres UISegmentedControl 320 pt. weit müssen Sie 1 pt entfernen. und dann dividiere durch 2. Und (320-1)/2 ist 159.5. iOS legt diesen Wert auf 159 pt. Und du erhältst einen 1 Punkt. Grenze und zwei 159 pt. Segmente. Welches ist 319, und nicht 320. Daher der 1pt. Zeile rechts von Ihrem segmentierten Control.
Es gibt eine Möglichkeit, die Größe "actual" (Größe des Renderings auf dem Bildschirm) des segmentierten Controls zu berechnen. Mit dieser Breite können Sie dann eine UIView mit abgerundeten Ecken unterhalb des UISegmentedControls hinzufügen. Dieser Code sollte für alle Konfigurationen arbeiten, auch wenn Sie manuell große Segmente in Ihrem segmentedControl haben:
- (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;
}
Bitte beachten Sie die Rahmen selbst ändert.
In diesem Screenshot sehen Sie den Unterschied zwischen den beiden Steuerelementen. Alle Rahmen sind 280 pt. breit.
Aufgrund der Formel UISegmentiertControl verwendet die erste Steuerelemente tatsächliche Größe ist 278 pt. Und die wahre Größe des zweiten ist 279 pt.
Das Problem ist, dass dies irgendwie über die Umsetzung der UISegmentedControl beruht. Apple könnte beispielsweise die Implementierung so ändern, dass segmentWidth, das auf 0,5 Punkte endet, angezeigt wird. Sie könnten dies leicht auf Retina-Displays tun.
Wenn Sie diesen Code verwenden, sollten Sie Ihre Anwendung auf neue iOS-Versionen überprüfen so früh wie möglich. Wir verlassen uns auf Implementierungsdetails, und diese könnten sich jeden Tag ändern. Glücklicherweise passiert nichts Schlechtes, wenn sie die Implementierung ändern. Es wird einfach nicht gut aussehen.
können Sie einstellen, 'segmented.backgroundColor = [UIColor Clear];' –
@Viruss mca: Vielen Dank für Ihren Kommentar, aber in diesem Fall, den Hintergrund hinter "Tratad wie "ist in grau dargestellt, nicht weiß. – neutrino
Sie können auch zwei UIButtons anstelle von UISegmentedControl als alternative Lösung verwenden. – Engnyl