从库中更改 UIBarButton 图像

Change UIBarButton image from gallery

我有 UIBarButton,用户可以使用图像选择器更改刚刚选择的照片或图库图像。我的问题是比例图像不好。

如果我使用 AspectFit,我的 UIBarButton 看起来像这样:

如果我使用 AspectFill,我的 UIBarButton 看起来像这样:

如果我先尝试更改图像大小并在设置之后,图像总是被划伤:

这是我的代码:

    func createPhotoBarButton(image: Data) {
        let barbtn = UIBarButtonItem()

        var image = UIImage(data:image)
        if image == nil {
            image = UIImage(named: "photoIcon")
        }

        let imageView = UIImageView(frame: CGRect(x: 0.0, y: 0.0, width: 35.0, height: 35.0))

        imageView.image = image?.resizedImage(newSize: CGSize(width: 35, height: 35))?.withRenderingMode(.alwaysOriginal)
//                imageView.image = cropToBounds(image: image!, width: 35, height: 35)

//        imageView.image = image

        imageView.contentMode = .scaleAspectFill
        imageView.layer.cornerRadius = imageView.frame.size.height / 2
        imageView.layer.masksToBounds = true
        imageView.clipsToBounds = true



        self.navigationItem.rightBarButtonItem = barbtn

        barbtn.customView = imageView
        barbtn.customView?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(photoTapped(_:))))
    }

这里是调整图片大小的函数:

func resizedImage(newSize: CGSize) -> UIImage? {
    guard size != newSize else { return self }

    let hasAlpha = false
    let scale: CGFloat = 0.0
    UIGraphicsBeginImageContextWithOptions(newSize, !hasAlpha, scale)
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)

    draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
    let newImage: UIImage? = UIGraphicsGetImageFromCurrentImageContext()


    UIGraphicsEndImageContext()
    return newImage
}

请帮我找到解决问题的正确方法。

尝试使用以下代码创建自定义按钮:

func createPhotoBarButton(image: Data) {
    let imageBtnContainer = UIButton()
    let imageBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
    var image = UIImage(data:image)
    if image == nil {
        image = UIImage(named: "photoIcon")
    }
    imageBtn.setImage(image, forState: UIControlState.Normal)
    imageBtn.frame = CGRectMake(0, 0, 53, 31)
    imageBtn.imageView?.contentMode = .scaleAspectFit

    imageBtnContainer.addSubview(imageBtn)

    self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: imageBtnContainer)
    ...
}

你不再需要resizedImage(..)功能

据我了解你的问题。我找到了解决办法。

试试这个

func createPhotoBarButton(image: Data) {
        let barbtn = UIBarButtonItem()

        let imageView = UIImageView(frame: CGRect(x: 0.0, y: 0.0, width: 35.0, height: 35.0))

        var image = UIImage(data:image)
        if image == nil {
            image = UIImage(named: "photoIcon")?.resize(maxWidthHeight: Double(imageView.frame.size.width))
        }

        imageView.image = image
        imageView.contentMode = .scaleAspectFill
        imageView.layer.cornerRadius = imageView.frame.size.height / 2
        imageView.layer.masksToBounds = true
        imageView.clipsToBounds = true

        self.navigationItem.rightBarButtonItem = barbtn

        barbtn.customView = imageView
        barbtn.customView?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(photoTapped(_:))))
}

调整大小方法

extension UIImage {

    func resize(maxWidthHeight : Double)-> UIImage? {

        let actualHeight = Double(size.height)
        let actualWidth = Double(size.width)
        var maxWidth = 0.0
        var maxHeight = 0.0

        if actualWidth > actualHeight {
            maxWidth = maxWidthHeight
            let per = (100.0 * maxWidthHeight / actualWidth)
            maxHeight = (actualHeight * per) / 100.0
        }else{
            maxHeight = maxWidthHeight
            let per = (100.0 * maxWidthHeight / actualHeight)
            maxWidth = (actualWidth * per) / 100.0
        }

        let hasAlpha = true
        let scale: CGFloat = 0.0

        UIGraphicsBeginImageContextWithOptions(CGSize(width: maxWidth, height: maxHeight), !hasAlpha, scale)
        self.draw(in: CGRect(origin: .zero, size: CGSize(width: maxWidth, height: maxHeight)))

        let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
        return scaledImage
    }

}

输出

这是工作代码 (swift 4)

override func viewDidLoad() {

    let containView = UIView(frame: CGRect(x: 0, y: 0, width: 35, height: 35))

    let Button : UIButton = UIButton.init(type: .custom)
    Button.frame = CGRect(x: 0, y: 0, width: 35, height: 35)
    Button.Round = true
    Button.setImage(UIImage(named: "photoIcon"), for: .normal)
    Button.addTarget(self, action: #selector(btnTapped), for: .touchUpInside)   
    containView.addSubview(Button)
    let rightBarButton = UIBarButtonItem(customView: containView)
    self.navigationItem.rightBarButtonItem = rightBarButton
}

此处的按钮操作

@objc func btnTapped(_ sender: Any) {
    print("Click Event")
}

延长回合

extension UIView{

    @IBInspectable var Round:Bool{
        get{
            return false
        }
        set{
            if newValue == true {
                self.layer.cornerRadius = self.frame.size.height/2;
                self.layer.masksToBounds = true;
            }

        }
    }
}

输出: