如何缩小UISegmentedControl中使用的图像?我正在以编程方式创建分段控件:
UISegmentedControl * segmentButton;
segmentButton = [UISegmentedControl segmentedControlWithItems:
[NSArray arrayWithObjects:
[UIImage imageNamed:@"option_one.png"],
[UIImage imageNamed:@"option_two.png"],
nil]];
segmentButton.contentMode = UIViewContentModeScaleToFill;
segmentButton.frame = CGRectMake(10, 10, 200, 32);
[view addSubview:segmentButton];结果不是我期望的那样。原始的.png图像大约有100个像素高,它们不被缩小以适应分段控制的32像素高度。这将导致绘制一个分段的控件,并将其与巨大的图像重叠:

我如何告诉控件缩小这些图像?
发布于 2011-02-04 13:47:06
你不应该用“大”图像来显示一个小图片。完整的图像将被加载到内存中,只有10%的像素将被显示出来,所以您将使用大量的内存。
如果您真的想使用这个资源,您可以做的是在前面创建一个带有代码的缩略图,并使用这个新生成的缩略图。
下面的方法返回一个可以在UISegmentedControl中使用的新映像,并且可以发布大的映像。
- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}使用您的代码:
UISegmentedControl * segmentButton;
segmentButton = [UISegmentedControl segmentedControlWithItems: [NSArray arrayWithObjects:
[self imageWithImage:[UIImage imageNamed:@"option_one.png"] scaledToSize:CGSizeMake(32, 32)],
[self imageWithImage:[UIImage imageNamed:@"option_two.png"] scaledToSize:CGSizeMake(32, 32)],
nil]];
segmentButton.contentMode = UIViewContentModeScaleToFill;
segmentButton.frame = CGRectMake(10, 10, 200, 32);
[view addSubview:segmentButton];发布于 2017-08-03 15:23:11
在swift3中,
extension UIImage {
func scaleImage(scaleToSize: CGSize) -> UIImage {
UIGraphicsBeginImageContext(scaleToSize)
self.draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: scaleToSize))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
}发布于 2021-10-11 05:10:13
For iOS 14及更高版本的
UIGraphicsGetImageFromCurrentImageContext使一些图像不那么清晰,所以我改用UIGraphicsImageRenderer,它对我来说很好。

extension UIImage {
func resizedImage(to targetSize: CGSize) -> UIImage? {
let render = UIGraphicsImageRenderer(size: targetSize)
return render.image { ctx in
self.draw(in: .init(origin: .zero, size: targetSize))
}
}
}
class SomeView: UIView {
func initSegementedControl() {
exampleSegmenedControl = UISegmentedControl(items:[
leftImage.resizedImage(to: .init(width: 15, height: 15))!,
rightImage.resizedImage(to: .init(width: 15, height: 15))!
])
}
}https://stackoverflow.com/questions/4896513
复制相似问题