【问题标题】:Can I put a UIImageView in a UIButton in swift?我可以快速将 UIImageView 放在 UIButton 中吗?
【发布时间】:2021-11-18 10:37:33
【问题描述】:

所以这是我的问题。

我需要用 3 个按钮制作一个应用程序。所有这些按钮都使用户能够添加图像,该图像假定与此类按钮位于完全相同的位置。

我这样声明我的按钮

@IBOutlet weak var image1: UIButton!
    @IBOutlet weak var image2: UIButton!
    @IBOutlet weak var image3: UIButton!
    @IBOutlet weak var buttonTest: UIButton!

首先尝试将图像应用到按钮以添加图像,它可以工作,但图像大小不合适

第二次我尝试使用这样的背景图片

但它不起作用。图片没有出现。

我也尝试使用 UIImageView 而不是 UIButton,但 UIImageVIew 没有“动作”,并且很难创建一个gestureRecognizer 并将其与我的 ImagePicker 一起使用

所以,我的问题是,是否可以将 UIButton 子类化以在其中放置 UIImageView ?因为我不想使用在 UIImageView 中更改 UIImage 的按钮重复相同的代码 3 次。

我希望我已经足够清楚了。如果您需要更多解释,请告诉我。

谢谢你:D

编辑:

好的,现在我想用 UIImageVIew 来做这件事。 所以我声明了每个 UIImageView,并添加了一个调用函数的手势识别器。如何添加参数“sender”以将点击的图像发送到函数?

    @IBOutlet weak var image2: UIImageView!
    @IBOutlet weak var image3: UIImageView!
    @IBOutlet weak var image4: UIImageView!
    @IBOutlet weak var image5: UIImageView!
    @IBOutlet weak var image6: UIImageView!

    let tapGestureRecognizer = UITapGestureRecognizer(target: self,     action: #selector(imageTapped(tapGestureRecognizer:)))
            
        image1.addGestureRecognizer(tapGestureRecognizer)
        image2.addGestureRecognizer(tapGestureRecognizer)
        image3.addGestureRecognizer(tapGestureRecognizer)
        image4.addGestureRecognizer(tapGestureRecognizer)
        image5.addGestureRecognizer(tapGestureRecognizer)
        image6.addGestureRecognizer(tapGestureRecognizer)

@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
    {
        let tappedImage = tapGestureRecognizer.view as! UIImageView

        // Your action
    }

【问题讨论】:

  • "但是 UIImageVIew 没有"动作",很难创建一个gestureRecognizer 并将它与我的ImagePicker 一起使用"真的吗?那么,也许这就是你应该提出的问题。我一直在制作可点击的图像视图。听起来这就是你真正需要的。
  • @matt 是的,我试过了,它奏效了。但我没有找到如何将它与我的 ImagePicker 链接
  • 再问一遍,然后显示你的代码。同样,我可以毫不费力地点击图像视图并用图像选择器的结果填充它,所以这是完全可能的。
  • @matt 不错!好的,我会给你一些屏幕截图
  • 不,不显示代码图片。代码是文本。只需复制、粘贴、格式化即可。

标签: ios swift uibutton uiimageview uiimage


【解决方案1】:

子类化 UIButton 是正确的,但是子类化它的父类 UIControl 会好得多。这将为您提供创建伪按钮所需的所有控制操作,但没有 UIButton 子类的限制,也没有重新创建所有手势识别器的开销。然后,您可以像设计任何其他 UIView 一样对其进行设计/布局。

作为一个简单(且未优化)的示例:

//create button class, with a big image in the middle of the view
class MyButton: UIControl {
   let buttonImage = UIImage(systemName: "hand.tap")
   let highlightedButtonImage = UIImage(systemName: "hand.tap.fill")
   lazy var buttonView = UIImageView(image: buttonImage)
   
   override init(frame: CGRect) {
      super.init(frame: frame)
      buttonView.image
      backgroundColor = .systemPink
      addSubview(buttonView)
      buttonView.translatesAutoresizingMaskIntoConstraints = false
      NSLayoutConstraint.activate([
         buttonView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 20),
         buttonView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -20),
         buttonView.topAnchor.constraint(equalTo: topAnchor, constant: 20),
         buttonView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -20)
      ])
   }
   
   required init?(coder: NSCoder) {
      fatalError("init(coder:) has not been implemented")
   }
}


//add button to the view controller
class myViewController: UIViewController {
   override func viewDidLoad() {
      super.viewDidLoad()
      view.backgroundColor = .systemCyan
      let myButton = MyButton(frame: .zero)
      myButton.addTarget(self, action: #selector(buttonPressUp(_:)), for: .touchUpInside)
      myButton.addTarget(self, action: #selector(buttonPressDown), for: .touchDown)
      
      vc.view.addSubview(myButton)
      myButton.translatesAutoresizingMaskIntoConstraints = false
      NSLayoutConstraint.activate([
         myButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 100),
         myButton.topAnchor.constraint(equalTo: view.topAnchor, constant: 100),
         myButton.widthAnchor.constraint(equalToConstant: 200),
         myButton.heightAnchor.constraint(equalToConstant: 200)
      ])
   }
   
   @objc func buttonPressDown(_ button: MyButton) {
      button.buttonView.image = button.highlightedButtonImage
   }
   
   @objc func buttonPressUp(_ button: MyButton) {
      print("button tapped")
      button.buttonView.image = button.buttonImage
   }
}

【讨论】:

  • 我不确定。我应该继承 UIControl 然后添加 UIButton 和 UIImageView 类型的属性吗?自从我用 swift 编程以来,我只分类了两次,所以我还不太适应
  • @GuillaumeBOURLART 我会用一个如何使用它的例子来更新我的答案......
  • @fIanker 好的,非常感谢!
  • 除了我个人将 UIImageView 子类化以创建一个知道如何在点击时使用图像选择器填充自身的图像视图。
  • @matt 很确定在原始帖子中没有提到图像选择器。这就是为什么我更喜欢提出新问题而不是经过重大编辑的旧问题:-/。无论如何,在新的场景中,我同意。
猜你喜欢
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2011-01-17
  • 2011-02-21
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多