UISegmentedControl масштабирование изображения - PullRequest
8 голосов
/ 04 февраля 2011

Как я могу уменьшить изображения, используемые в 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

Как я могу сказать элементу управления уменьшить эти изображения?

Ответы [ 2 ]

19 голосов
/ 04 февраля 2011

Никогда не используйте «большое» изображение, чтобы отображать только маленькое изображение. Полное изображение будет загружено в память, и будет отображаться только 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 голос
/ 03 августа 2017

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