UISegmentedControl界限

neu*_*ino 18 iphone uisegmentedcontrol ios7

我想将以下方面提供给UISegmentedControl:

在此输入图像描述

请注意灰色背景视图和分段控件非选定项目的白色背景.

但是,如果我给我的UISegmentedControl一个白色背景,我得到以下内容:

在此输入图像描述

注意UISegmentedControl周围的白色方角.我该怎么做才能避免那个方角?

先感谢您,

编辑:如果我更改UISegmentedControl的图层的角半径,如onegray所示,结果更好,但不完美(注意右边的白线):

在此输入图像描述

one*_*ray 16

设置_segmentedControl.layer.cornerRadius = 5;可能会有帮助.

更新:更复杂的剪辑矩形摆脱1px正确的空间:

    CAShapeLayer* mask = [[CAShapeLayer alloc] init];
    mask.frame = CGRectMake(0, 0, _segmentedControl.bounds.size.width-1, _segmentedControl.bounds.size.height);
    mask.path = [[UIBezierPath bezierPathWithRoundedRect:mask.frame cornerRadius:4] CGPath];
    _segmentedControl.layer.mask = mask;
Run Code Online (Sandbox Code Playgroud)

更新:Matthias Bauch提供了一个很好的解释,为什么这个空格出现在右侧UISegmentedControl.因此,最简单的移除方法是制作固定尺寸的线段并调整它们以获得适当的宽度.


Mat*_*uch 10

如果这应该适用于所有UISegmentedControls,这有点麻烦.问题是iOS7的1磅.两个段之间的边界不计入段的大小.例如,如果您的UISegmentedControl的帧是320磅.宽,你必须删除1磅.并且除以2.而(320-1)/ 2是159.5.iOS将此值降至159磅.而你最终得到1分.边境和两个159角.段.这是319,而不是320.因此1pt.segmentedControl右侧的行.

有一种方法可以计算segmentedControl的"实际"(屏幕上的渲染大小)大小.使用该宽度,您可以在UISegmentedControl下面添加带圆角的UIView.此代码应适用于所有配置,即使您在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;
}
Run Code Online (Sandbox Code Playgroud)

请自己处理框架更改.

请参阅此屏幕截图,了解两个控件之间的区别.所有镜架均为280磅.宽.

由于公式UISegmentedControl使用的第一个控件实际大小是278磅.而第二个的实际尺寸是279磅.

在此输入图像描述


问题是,这在某种程度上依赖于UISegmentedControl的实现.例如,Apple可以更改实现,因此将显示以.5磅结尾的segmentWidth.他们可以轻松地在视网膜显示屏上做到这一点

如果您使用此代码,则应尽早在新iOS版本上检查您的应用.我们依赖于实施细节,这些细节可能每天都在变化.幸运的是,如果他们改变了实现,就不会发生任 它看起来不太好看.