2011-02-04 122 views
8

如何缩小UISegmentedControl中使用的图像?我正在编程创建分段控件: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

我怎么能告诉控制缩减这些图片?

回答

19

你不应该使用“大”图像来显示一个小图片。完整的图像将被加载到内存中,只有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 2011-02-04 14:19:37

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