[英]How to get location of UIButton in Tableview cell, and add target in Swift?
我想在Swift的TableviewCell上添加一个按钮,以弹出一个小的自定义视图(覆盖当前视图),其中包含一些在线信息。
我创建了另一个(“弹出式视图”的ViewController +自定义视图,并调整了它的大小。
在tableviewcell类中,在Button.AddTarget(..)相关函数中,我调用了PresentViewController(..) 。
我有这些问题:
如何在TableviewCell的屏幕窗口中获取按钮(或触摸位置)的X,Y坐标 ?
我进行了搜索,但最相关的答案是关于TableviewController而不是TableviewCell。
================================================== ======
我努力了:
import UIKit
import QorumLogs
class TabelViewSearchStockCell: UITableViewCell, UIViewControllerTransitioningDelegate {
@IBOutlet weak var mainImageView: UIImageView!
@IBOutlet weak var productCodeLabel: UILabel!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var stockButton: UIButton!
@IBOutlet weak var view: UIView!
var cellType:String?
var searchCell: SearchResult?
{
didSet{
// 1. set image
if let imageId = searchCell?.id_img{
let urlCovertor = GetImgUrl()
let urlStr = urlCovertor.getSmall(imageId)
let url = NSURL(string: urlStr)
mainImageView.sd_setImageWithURL(url)
}
// 2. set_title
titleLabel.text = searchCell?.title
// 3. set product code
productCodeLabel.text = searchCell?.productcode
// 4. set price area
stockButton.addTarget(self, action: #selector(TabelViewSearchStockCell.checkStock), forControlEvents: .TouchUpInside)
}
}
// MARK: - set location
private lazy var animatorManager: PresentationManager = {
let buttonRect = self.stockButton.superview?.convertRect(self.stockButton.frame, toView: self.view)
let manager = PresentationManager()
manager.presentFrame = buttonRect!
return manager
}()
}
// MARK:- Listen button
extension TabelViewSearchStockCell{
@objc private func checkStock(){
// create menu
let sb = UIStoryboard(name: "Popover",bundle: nil)
guard let menuView = sb.instantiateInitialViewController() else{
return
}
menuView.transitioningDelegate = animatorManager
menuView.modalPresentationStyle = UIModalPresentationStyle.Custom
self.window?.rootViewController?.presentViewController(menuView, animated: true, completion: nil)
}
}
它仍然总是出现在C1中
我想要单击位置S1上的按钮时,它将在位置C2而不是C1上显示“弹出窗口”。 这意味着,popupview将始终显示在我单击的按钮的正下方。
对于第一个问题,您可以在按钮的超级视图上调用convertRect
,超级视图应该是表格视图单元格的内容视图。 如果您无法阅读harpreet给出的代码,则以下为快速翻译:
let frame = yourButton.superview.convertRect(yourButton.frame, toView: self.view)
现在,此框架是按钮相对于self.view
的框架。
对于第二个问题,您可以设置按钮的tag
属性,并在表视图单元格的内容视图上调用viewWithTag
来取回按钮。
这是如何做:
如果您的单元格位于情节提要中,请选择按钮,然后在右侧的属性检查器中将“标签”设置为某个数字。 如果您通过代码创建按钮,则可以通过以下方式设置标签
yourButton.tag = someNumber
然后,您只需要获取表视图单元格的contentView
并调用viewWithTag
:
let contentView = cell.contentView
let button = contentView.viewWithTag(someNumber)!
现在您可以添加目标了!
button.addTarget(...)
编辑:
如果您使用的是情节提要,则可以控制将按钮拖到代码中,然后创建一个动作。 小心! 不要意外添加插座! 请记住,首先在弹出窗口中将“插座”更改为“动作”!
您要做的是相对于self.view将UITableView中UITableViewCell中的按钮的CGRect转换为CGRect。
CGRect frame = [[youButton superview] convertRect: yourButton.frame toView: self.view];
您可以使用此框架的原点来播放弹出视图的位置
您对“我如何推出特定值(id_item)”有什么含义? 在你的2nd
问题?
我建议您将按钮目标添加到单元格之外(即:在控制器中cell for row
实现tableView的dataSource函数cell for row
时,请使用button.add target...
)。
然后,您可以照常做自己想做的事,祝您好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.