【问题标题】:UIButton in Swift with two imagesSwift中的UIButton有两个图像
【发布时间】:2015-11-01 03:31:00
【问题描述】:

我正在尝试制作一个 UIButton,它在按钮标题的任一侧(左侧和右侧)都有一个 UIImage。理想情况下,图像将固定在按钮的左侧和右侧,并且标题将居中,但我可以忍受图像就在我想的标题标签旁边。我已经能够添加一张图片,它出现在标题之前,但我该如何添加第二张呢?

【问题讨论】:

    标签: swift uibutton customization


    【解决方案1】:

    我知道这是一个老问题,但由于没有提供代码并且有人要求它,我想我会分享我的解决方案。

    我所做的是创建一个子类 UIButton 的新类。我确保您也可以在界面构建器中立即看到您所做的所有更改。所以你可以只拖入一个 UIButton。将类指定为您自己的类,它将允许您设置图像并立即看到它被绘制

    这是我为实现这一目标所做的工作

    import UIKit
    
    @IBDesignable
    class AddProfilePictureView: UIButton {
    
        @IBInspectable var leftHandImage: UIImage? {
            didSet {
                leftHandImage = leftHandImage?.withRenderingMode(.alwaysOriginal)
                setupImages()
            }
        }
        @IBInspectable var rightHandImage: UIImage? {
            didSet {
                rightHandImage = rightHandImage?.withRenderingMode(.alwaysTemplate)
                setupImages()
            }
        }
    
        func setupImages() {
            if let leftImage = leftHandImage {
                self.setImage(leftImage, for: .normal)
                self.imageView?.contentMode = .scaleAspectFill
                self.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.frame.width - (self.imageView?.frame.width)!)
            }
    
            if let rightImage = rightHandImage {
                let rightImageView = UIImageView(image: rightImage)
                rightImageView.tintColor = COLOR_BLUE
    
                let height = self.frame.height * 0.2
                let width = height
                let xPos = self.frame.width - width
                let yPos = (self.frame.height - height) / 2
    
                rightImageView.frame = CGRect(x: xPos, y: yPos, width: width, height: height)
                self.addSubview(rightImageView)
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      我会把它分成一个集合视图中的两个按钮——它非常灵活,可以很好地处理这样的事情。

      【讨论】:

        【解决方案3】:

        通过addSubview为按钮添加一个带有图像的UIImageView,通过setImage为按钮添加另一个图像,可以通过titleEdgeInsetsimageEdgeInsets进行调整。

        如果您需要代码示例,请告诉我。

        希望对您有所帮助!

        【讨论】:

        • 嘿,我知道你是去年写的,但认为你可以展示一些示例代码?
        【解决方案4】:

        Swift 5、XCode 11.6

        请在您的扩展程序或自定义 UIButton 类中使用以下代码。我在我的自定义类中使用了以下代码。该函数将分别设置左或右图像并对齐文本。

        /// Sets a left and right image for a button
        /// - Parameters:
        ///   - right: right image
        ///   - left: left image
        func setImages(right: UIImage? = nil, left: UIImage? = nil) {
            if let leftImage = left, right == nil {
                setImage(leftImage, for: .normal)
                imageEdgeInsets = UIEdgeInsets(top: 5, left: (bounds.width - 35), bottom: 5, right: 5)
                titleEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: (imageView?.frame.width)!)
                contentHorizontalAlignment = .left
            }
            if let rightImage = right, left == nil {
                setImage(rightImage, for: .normal)
                imageEdgeInsets = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: (bounds.width - 35))
                titleEdgeInsets = UIEdgeInsets(top: 0, left: (imageView?.frame.width)!, bottom: 0, right: 10)
                contentHorizontalAlignment = .right
            }
        
            if let rightImage = right, let leftImage = left {
                setImage(rightImage, for: .normal)
                imageEdgeInsets = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: (bounds.width - 35))
                titleEdgeInsets = UIEdgeInsets(top: 0, left: (imageView?.frame.width)!, bottom: 0, right: 10)
                contentHorizontalAlignment = .left
        
                let leftImageView = UIImageView(frame: CGRect(x: bounds.maxX - 30,
                                                              y: (titleLabel?.bounds.midY)! - 5,
                                                              width: 20,
                                                              height: frame.height - 10))
                leftImageView.image?.withRenderingMode(.alwaysOriginal)
                leftImageView.image = leftImage
                leftImageView.contentMode = .scaleAspectFit
                leftImageView.layer.masksToBounds = true
               addSubview(leftImageView)
            }
        
        }
        

        用法:

        1. vegaButton.setImage(right: myImage) // 右图
        2. vegaButton.setImage(left: myImage) // 左图
        3. vegaButton.setImage(right: myImage, left: myImage) // 两个图像。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-21
          • 2015-01-06
          • 2021-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多