代码之家  ›  专栏  ›  技术社区  ›  Xin Lok

如何在SegmentController中以编程方式匹配图像-Swift

  •  1
  • Xin Lok  · 技术社区  · 7 年前

    我需要在SegmentController-Swift中设置一个图像。

        let testTypeSegmentedControl: UISegmentedControl = {
    
        let types = [“Green”, “Blue”] // v_concreteSelectedIndex
        let sc = UISegmentedControl(items: types)
        sc.setImage((UIImage(named: "Green_Main.png")), forSegmentAt: 0)
    
        sc.selectedSegmentIndex = 0
        sc.translatesAutoresizingMaskIntoConstraints = false
        sc.tintColor = .black
    
        return sc
    }()
    

    如何在段控制器中正确地固定图像。

    我尝试过:

    sc.contentMode = .scaleAspectFill
    

    但似乎效果不太好。

    我试着使用约束,但我不知道怎么做。

    有什么建议吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Govind Kumawat    7 年前

    结果与预期不符,因为您使用的原始.png图像的分辨率更高。你不应该用“大”的图像只显示一个小的象形文字。完整的图像将加载到内存中,并且只显示其像素的10%,因此您将使用大量的内存而不需要任何东西。

    如果您真的想使用这个资源,您可以做的是用以前的代码创建一个新的映像,并使用这个新生成的映像。

    以下方法返回可在 UISegmentedControl 你可以释放大的那个。

    func image(with image: UIImage?, scaledTo newSize: CGSize) -> UIImage? {
            UIGraphicsBeginImageContext(newSize)
            image?.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
            let newImage: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return newImage
        }
    

    在您的代码中:

        let testTypeSegmentedControl: UISegmentedControl = {
        let sc = UISegmentedControl(items: ["One", "Two"])
            sc.selectedSegmentIndex = 0
            sc.translatesAutoresizingMaskIntoConstraints = false
            return sc
        }()
    
    
    override func viewDidLoad() {
    
        super.viewDidLoad()
        self.view.addSubview(testTypeSegmentedControl)
    
        let newImage = image(with: (UIImage(named: "watermelon.png")), scaledTo: CGSize(width: 32, height: 30))
        testTypeSegmentedControl.setImage(newImage , forSegmentAt: 0)
    
    }