UIImageView 上的按钮不可点击

Posted

技术标签:

【中文标题】UIImageView 上的按钮不可点击【英文标题】:The button on UIImageView is not clickable 【发布时间】:2016-02-04 04:42:41 【问题描述】:

我以编程方式创建UIImageView,并在其上添加一个UIButton。但按钮不可点击。

当我点击按钮My account 时,它会像第二张照片一样显示。 UIImageView 将出现,并且上面有一个按钮 My profile。但是My profile 在我单击时不起作用。当我再次单击My account 时,UIImageView 会按我的预期消失(MY profile 也会消失)

action: "clickProfile"修改为action: "clickProfile:",还是不行。当我点击按钮myAccount 时,UIImageView 将出现,当我点击UIImageView 上的按钮时,它应该打印“工作”。当我单击myAccount 时,UIImageView 将消失。 这是我所有的代码:

class userViewController: UIViewController,UIPopoverPresentationControllerDelegate 

let picker = UIImageView(image: UIImage(named: "picker"))

func createPicker()

picker.frame = CGRect(x: ((self.view.frame.width / 2) - 143), y: 200, width: 286, height: 291)
picker.alpha = 0
picker.hidden = true
picker.userInteractionEnabled = true


self.view.addSubview(picker)





func clickProfile(sender:UIButton!)

print("should work")



override func viewDidLoad() 
super.viewDidLoad()
self.picker.userInteractionEnabled = true
createPicker()



override func didReceiveMemoryWarning() 
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.



@IBAction func myAccount(sender: UIButton) 

picker.hidden ? openPicker() : closePicker()



func openPicker()

self.picker.hidden = false

UIView.animateWithDuration(0.3,
    animations: 
        self.picker.frame = CGRect(x: ((self.view.frame.width / 2) - 143), y: 230, width: 286, height: 291)
        self.picker.alpha = 1
)

var offset = -180

let buttonProfile:UIButton = UIButton(type: UIButtonType.Custom) as UIButton
buttonProfile.frame = CGRect(x: 140, y: offset, width: 260, height: 43)


buttonProfile.setTitleColor(UIColor(red: 0.85, green: 0.22, blue: 0.71, alpha: 1.0), forState: .Normal)
//  button.setTitleColor(UIColor(rgba: feeling["color"]!), forState: .Normal)
buttonProfile.setTitle("My profile", forState: .Normal)
buttonProfile.tag = 0
buttonProfile.addTarget(self, action: "clickProfile:", forControlEvents: UIControlEvents.TouchUpInside)

picker.addSubview(buttonProfile)



func closePicker()

UIView.animateWithDuration(0.3,
    animations: 
        self.picker.frame = CGRect(x: ((self.view.frame.width / 2) - 143), y: 200, width: 286, height: 291)
        self.picker.alpha = 0
    ,
    completion:  finished in
        self.picker.hidden = true
    
)



我已经启用 userInteractionEnabled 为真,但 UIImageView 上的按钮仍然不起作用。它是怎么发生的?

【问题讨论】:

你的 UIbutton 和 UIImageview 框架是什么?确保它是相同的,我认为 Button 没有得到 UiImageview 的确切框架...请检查一次... 我认为您缺少: 尝试将action: "clickProfile" 替换为action: "clickProfile:" action: "clickProfile:" 对我也不起作用。 【参考方案1】:

尝试记录您的选择器和按钮框架。

从您的代码中,这些控件的框架略微偏离,您的按钮框架应该位于选取器内。

picker.frame = CGRect(x: ((self.view.frame.width / 2) - 143), y: 200, width: 286, height: 291)

buttonProfile.frame = CGRect(x: 140, y: -180, width: 260, height: 43)

假设您在 iPhone 5 sim/设备上运行,分辨率为 320 x 568。

假设您的self.view 框架与此相同。

因此,self.view 中的选择器框架为 (17, 200, 286, 290),选择器坐标中的按钮框架为 (140, -180, 260, 43),当转换为 self.view 时,坐标变为 (157 , 20, 260, 43)。

这些坐标的视觉表示如下。

如您所见,您的按钮(绿色图片)不在应有的位置,请尝试修改按钮框架,使按钮位于您的选择器内(红色图片)。

【讨论】:

你能告诉我如何为这些坐标制作视觉表示吗?如何记录框架?我什至不知道如何在网上搜索。我试图将 UIImageView 移动到右上角,以便按钮可以位于 UIImageView 内,但我不知道 UIImageView 的 x,y 值应该是什么。 (不移动按钮,而是移动 UIImageView) 您可以使用此print("%@", NSStringFromCGRect(picker.frame) 记录帧。至于视觉表示,我正在使用游乐场并使用这些框架创建控件。 你能告诉我如何用这些框架创建控件吗?我创建了一个游乐场并调用类或这些子函数,但它没有显示结果。你能告诉我如何调用类可以让它像你一样显示视觉表示吗? 尝试按照这些教程进行操作。 possiblemobile.com/2015/03/…【参考方案2】:

不建议在图像视图中添加子视图。即使你这样做了,如果图像视图被隐藏,那么它的所有子视图也将被隐藏。当视图被隐藏时,用户交互无论如何都不会发生。

您应该将按钮添加到 self.view 并将其放在图像视图的顶部,而不是将其放在图像视图内。试试这个代码。

func createPicker()

    picker.frame = CGRect(x: ((self.view.frame.width / 2) - 143), y: 200, width: 286, height: 291)
    picker.alpha = 0
    picker.hidden = true
    picker.userInteractionEnabled = true
    picker.clipsToBounds = false

    self.view.addSubview(picker)

    let offset = 100


    let buttonProfile:UIButton = UIButton(type: UIButtonType.Custom) as UIButton
    buttonProfile.frame = CGRect(x: 140, y: offset, width: 260, height: 43)
    buttonProfile.setTitleColor(UIColor(red: 0.85, green: 0.22, blue: 0.71, alpha: 1.0), forState: .Normal)
    //  button.setTitleColor(UIColor(rgba: feeling["color"]!), forState: .Normal)
    buttonProfile.setTitle("My profile", forState: .Normal)
    buttonProfile.tag = 0
    buttonProfile.addTarget(self, action: "myAccount:", forControlEvents: UIControlEvents.TouchUpInside)

    self.view.addSubview(buttonProfile)



您的按钮偏移量也在屏幕外。我将其设置为 100 以使其出现在屏幕上。您可以根据自己的要求进行定位。

【讨论】:

picker.hidden 并不总是错误的。当我单击“我的帐户”按钮时,这将是真的。我只是更新我的代码。我想对“我的帐户”按钮实现下拉菜单效果,所以我需要将 UIImageView 设置为在单击“我的帐户”时消失并出现。我的按钮偏移在我的屏幕上工作(我使用的模拟器是 iphone6,它在我期望的位置)【参考方案3】:

您的选择器视图 alpha 为 0,隐藏为真。删除这些

picker.alpha = 0
picker.hidden = true

行。

更新这一行

    buttonProfile.addTarget(self, action: "clickProfile", forControlEvents: UIControlEvents.TouchUpInside)

    buttonProfile.addTarget(self, action: "clickProfile:", forControlEvents: UIControlEvents.TouchUpInside)

【讨论】:

没有。我需要选择器是透明的。并将 action: "clickProfile" 修改为 action: "clickProfile:" 仍然对我不起作用。 当我单击另一个按钮 myAccount 时,应该会出现 UIImageView。当我再次单击 myAccount 时,它应该会消失。 使用picker.backgroundColor = UIColor.clearColor() 使其透明,

以上是关于UIImageView 上的按钮不可点击的主要内容,如果未能解决你的问题,请参考以下文章

在 iOs 中调用按钮 setBackgroundImage 后 UIImageView 位置发生变化

使用 UIImageView 上的缩放按钮进行缩放

.AllowUserInteraction 不适用于 UIImageView

UIImageView 上的多个按钮

按住按钮时如何更改具有选定颜色的单元格

如果点击 ScrollView,则隐藏/显示按钮和 UIImageVIew