我想在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。这意味着,弹出视图将始终显示在我单击的按钮下方。
答案 0 :(得分:4)
对于第一个问题,您可以在按钮的超级视图上调用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(...)
编辑:
如果您正在使用故事板,则可以控制 - 将按钮拖到代码中,然后创建一个Action。小心!不要意外添加插座!请记住在弹出窗口中首先将“Outlet”更改为“Action”!
答案 1 :(得分:1)
你需要做的是将UITableView中UITableViewCell中的按钮CGRect转换为关于self.view的CGRect。
CGRect frame = [[youButton superview] convertRect: yourButton.frame toView: self.view];
您可以使用此框架的原点来播放弹出视图的位置
答案 2 :(得分:0)
您对“如何推送特定值(id_item)”有什么意义?你的2nd
问题?
我建议您将按钮目标添加到单元格之外(I.E:在控制器中实现tableView的dataSource函数button.add target...
时使用cell for row
。
然后你可以照常做你想做的事,祝你好运。