【问题标题】:UISegmentedControl image scalingUISegmentedControl 图像缩放
【发布时间】:2011-06-21 06:10:24
【问题描述】:

如何缩小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 像素高度。这会导致绘制一个分段控件,其中包含大量重叠的图像:

我如何告诉控件缩小这些图像?

【问题讨论】:

    标签: image ios scaling uisegmentedcontrol


    【解决方案1】:

    您永远不应该使用“大”图像来仅显示小图片。完整的图像会被加载到内存中,并且只有 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];
    

    【讨论】:

    • 同意,如果图像是动态的,则缩放它们,否则在您的应用资源中提供不同的大小。
    • segmentButton = [[[UISegmentedControl alloc] initWithItems:images] autorelease];
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 1970-01-01
        • 2010-10-12
        • 2023-03-13
        • 1970-01-01
        相关资源
        最近更新 更多