UISegmentedControl图片缩放

9

我该如何缩小在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个像素高度,导致分段控件被绘制时被重叠的巨大图像覆盖着: screen shot 我该如何告诉控件缩小这些图像呢?
3个回答

20

如果只是展示一个小图标,不应使用“大”图片。完整图片将会被加载到内存中,但只有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];

1
如果图片是动态的,请对其进行缩放,否则在您的应用资源中提供不同大小的图片。 - petert
1
segmentButton = [[[UISegmentedControl alloc] initWithItems:images] autorelease];分段按钮 = [[[UISegmentedControl alloc] initWithItems:images] autorelease]; - neoneye

1
在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!
    }
}

0

iOS 14及以上版本

UIGraphicsGetImageFromCurrentImageContext生成的某些图像不够清晰,因此我改用UIGraphicsImageRenderer,这对我来说效果很好。

enter image description here

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))!
        ])
    }    

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接