【问题标题】:Swift: how to make a UIView clickable in UITableViewCell?Swift:如何在 UITableViewCell 中使 UIView 可点击?
【发布时间】:2016-02-13 01:08:26
【问题描述】:

UITableViewCell 中,我正在尝试实现一个带有图像文本按钮

似乎标准的UIButton 无法实现这一点。所以我创建了一个UIView,其中包含一个UIImageView 和一个UILabel

你可以在右侧看到这里的实现,“follow trip”按钮(“+”是一个UIImageView,“follow trip”是一个UILabel)

我现在正试图使这样的UIView(即按钮)可点击,但我找不到方法。

这是我的实现,但它不起作用:

class StationsIntroHeader: UITableViewCell {

    @IBOutlet weak var bigButton: UIView!

    override  func awakeFromNib() {
        super.awakeFromNib()
        let tap = UITapGestureRecognizer(target: self, action: Selector("followTrip:"))
        bigButton.addGestureRecognizer(tap)
    }

    func followTrip(sender:UITapGestureRecognizer) {
        print("tap working")
    }
}

我已确保 User Interaction EnabledUIView 上为 ON,在 UIImageViewUILabel 上为 OFF

【问题讨论】:

  • 您可以只使用带有加号的橙色图像作为按钮的背景图像并右对齐跟随行程标签,或者您也可以添加与您的视图相同大小的自定义按钮并将其添加到您的具有透明背景且没有标签的视图,因此您可以单击它
  • 触摸正在被UITableView“吸收”。而是将手势识别器添加到 UITableView 并使用坐标来确定单击了哪个单元格和哪个按钮。
  • 对我来说,像你这样的实现完全有效!你确定你设置正确吗?

标签: ios swift uitableview uiview uitapgesturerecognizer


【解决方案1】:

对我来说,如下所示的示例设置完全有效:

class TableViewController: UITableViewController {
  override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 5
  }

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    return tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath: indexPath)
  }
}

class CustomCell: UITableViewCell {
  @IBOutlet weak var bigButton: UIView!

  override func awakeFromNib() {
    super.awakeFromNib()
    let tap = UITapGestureRecognizer(target: self, action: Selector("bigButtonTapped:"))
    bigButton.addGestureRecognizer(tap)
  }

  func bigButtonTapped(sender: UITapGestureRecognizer) {
    print("bigButtonTapped")
  }
}

我没有更改视图或图像视图或标签的 userInteractionEnabled 的任何默认值。将我的实现与您的进行比较,看看您是否可能忘记了什么……您是不是例如连接插座?

示例项目:https://www.dropbox.com/sh/hpetivhc3gfrapf/AAAf6aJ0zhvRINPFJHD-iMvya?dl=0

为您的项目编辑

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
  let headerCell = tableView.dequeueReusableCellWithIdentifier("StationsIntroHeader") as! StationsIntroHeader
  headerCell.update()
  return headerCell
  // return headerCell.update().contentView
}

【讨论】:

  • 嗨安德烈!我只是运行你的项目,它确实有效!我现在正在尝试比较控件的 Interface Builder 设置以发现任何差异
  • 如果您没有发现问题所在,请通过 Dropbox 分享您的项目 - 如果有的话 - 我会看看!
  • 我找不到修复程序!我上传了一个简化版:dropbox.com/sh/rgfvrn1jpqcfloj/AADEar4aryx08rwb6je5s_mqa?dl=0
【解决方案2】:

您可以简单地继承 UIButton,并在其中实现自定义绘图。 UIButton 是在不干扰 tableview 触摸的情况下完成任务的最简单方法。如果在表格视图上实现点击手势,则会导致单元格触摸出现问题。

您可以简单地获取自定义图像(+ 符号和文本作为一个图像)并将其用作背景图像。

或者你甚至可以用代码来绘制它。

例如,你可以试试这个:

 func drawCanvas1(frame frame: CGRect = CGRectMake(3, 8, 209, 109)) {
    //// General Declarations
    let context = UIGraphicsGetCurrentContext()

    //// Color Declarations
    let color = UIColor(red: 0.967, green: 0.423, blue: 0.211, alpha: 1.000)

    //// Image Declarations
    let screenShot20151111At32900PM = UIImage(named: "screenShot20151111At32900PM.png")!

    //// Rectangle Drawing
    let rectanglePath = UIBezierPath(roundedRect: CGRectMake(frame.minX + 39, frame.minY + 23, 113, 46), cornerRadius: 8)
    color.setFill()
    rectanglePath.fill()


    //// Rectangle 2 Drawing
    let rectangle2Rect = CGRectMake(frame.minX + 51, frame.minY + 27, 33, 34)
    let rectangle2Path = UIBezierPath(rect: rectangle2Rect)
    CGContextSaveGState(context)
    rectangle2Path.addClip()
    screenShot20151111At32900PM.drawInRect(CGRectMake(floor(rectangle2Rect.minX - 16 + 0.5), floor(rectangle2Rect.minY - 15 + 0.5), screenShot20151111At32900PM.size.width, screenShot20151111At32900PM.size.height))
    CGContextRestoreGState(context)


    //// Text Drawing
    let textRect = CGRectMake(frame.minX + 97, frame.minY + 23, 73, 46)
    let textTextContent = NSString(string: "\nfollow\ntrip\n")
    let textStyle = NSParagraphStyle.defaultParagraphStyle().mutableCopy() as! NSMutableParagraphStyle
    textStyle.alignment = .Left

    let textFontAttributes = [NSFontAttributeName: UIFont.systemFontOfSize(UIFont.labelFontSize()), NSForegroundColorAttributeName: UIColor.whiteColor(), NSParagraphStyleAttributeName: textStyle]

    let textTextHeight: CGFloat = textTextContent.boundingRectWithSize(CGSizeMake(textRect.width, CGFloat.infinity), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: textFontAttributes, context: nil).size.height
    CGContextSaveGState(context)
    CGContextClipToRect(context, textRect);
    textTextContent.drawInRect(CGRectMake(textRect.minX, textRect.minY + (textRect.height - textTextHeight) / 2, textRect.width, textTextHeight), withAttributes: textFontAttributes)
    CGContextRestoreGState(context)
}

结果会是这样的:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多