2011-02-04 167 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! 
    } 
}