我的 UISegmentedControl 有问题。它只有 2 个不同的片段,带有渲染模式 AlwaysTemplate 的图像。
这是我的问题:
如果我真的用手指轻敲这些片段,图像的色调和突出显示会正确更新。
但是,如果我尝试以编程方式更改选定的片段,高光会改变(图像周围的颜色),但图像色调保持不变,使其几乎不可见。只有当我点击这些片段时,片段中的图像色调才会更新。
这就是我尝试设置所选索引的方式:
[self.segmentControl setSelectedSegmentIndex:1];
// Optionally tried calling this after
[self.segmentControl sendActionsForControlEvents:UIControlEventValueChanged];
我努力了:
- 更改图像的渲染模式
- 在以编程方式更新所选索引后,在 UISegmentedControl 上调用 setValueChanged。
其他信息:
- UISegmentedControl 位于 NavigationBar 的 UIBarButtonItem 中。尽管这似乎并没有影响它,因为我已将其从其中删除,但它仍然反应不正确。
- 这发生在 iOS 9 和 iOS 10 设备上(仅限我测试过的版本)。
- 设置所选索引后,我尝试调用“setNeedsLayout”和“layoutIfNeeded”。没运气。
更新编辑:
我已经删除了状态 UIControlStateNormal 的 UISegmentedControl 的背景图像,现在着色工作正常。似乎如果我为该状态设置背景图像,则会出现此问题。
注意:背景图像是使用 CoreGraphics 绘制的。
删除了这条线,现在着色很好,但这并不能解决问题。我需要那里的图像进行造型:
[self.segmentControl setBackgroundImage:[UIImage segmentInactiveBackgroundImage] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
下面是背景图绘制方法:
UIImage *img = [UIImage imageForSize:CGSizeMake(5, BAR_BUTTON_HEIGHT) withDrawingBlock:^{
UIBezierPath *outline = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 5, BAR_BUTTON_HEIGHT)
byRoundingCorners:UIRectCornerAllCorners
cornerRadii:BAR_BUTTON_IMAGE_CORNER_RADIUS_SIZE];
[[UIColor segmentedControlInactiveBackgroundColor] setFill];
[outline fill];
}];
img = [img resizableImageWithCapInsets:UIEdgeInsetsMake(2, 2, 2, 2)];
return img;
我还尝试了一个非常简单的背景图像,看看它是否是绘制的方式。任何类型的背景图像都会弄乱图标的色调。即使使用它也会搞砸:
- (UIImage *)imageWithColor:(UIColor *)color {
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
我已经开始了一个新项目,并做了最低限度的让它复制这个错误,以确保没有其他东西影响它。它仍在发生。这是一个带有代码和错误的 GIF。