gpt4 book ai didi

iOS - 类似于 Snapchat 的 UITableViewCell 中的 UIGestureRecognizer

转载 作者:行者123 更新时间:2023-11-29 10:31:23 25 4
gpt4 key购买 nike

我正在尝试在我的练习应用程序中实现与 Snapchat 非常相似的功能,您可以在其中将 UITableViewCell 拖动到右侧或左侧,并且在拖动时,图像后面 View 会慢慢出现,直到它到达某个点,到达某个点后,它会启动一个 segue 或 PageViewController 类型 segue 到另一个 View Controller ,您可以用来与 friend 聊天。

起初,我尝试使用屏幕边缘平移手势识别器,但只有当您从屏幕边缘开始滑动时才有效。我需要能够从 UITableViewCell 中的任何位置滑动。

在 Snapchat 中演示了我需要的功能,当你在你 friend 的一个表格单元格上慢慢向右滑动时,你会更清楚地看到它,它会慢慢显示消息图标的图像,并最终导致你可以看到的另一个 View 聊天。

那么平移手势识别器就足够了吗?如果是这样,完成这项工作的最佳方法是什么?我看过有关平移手势识别器的教程,但我看不出在滑动一定距离后它最终如何导致另一个 View Controller 。我认为我可以将消息传递图标放在向右滑动时可能出现的显示的表格单元格内容后面,但我如何才能实现如此流畅的功能?

了解这一点确实会增加我在流畅的用户体验方面的体验。任何建议或方法将不胜感激,谢谢。

编辑:请在 objective-c 中留下答案。我不懂 swift 。

最佳答案

您可以为此创建自定义 TableViewCell。下面的代码应该可以满足您的要求。只需要将委托(delegate)添加到您的 ViewController

protocol TableViewCellDelegate {
func something()
}

class TableViewCell: UITableViewCell {

var startSegue = false
var label: UILabel // Or UIView, whatever you want to show
var delegate: TableViewCellDelegate? // Delegate to your ViewController to perform the segue

required init(coder aDecoder: NSCoder) {
fatalError("NSCoding not supported")
}

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {

// Utility method for creating the label / view
func createLabel() -> UILabel {
let label = UILabel(frame: CGRect.nullRect)

// Add label customization here

return label
}

// Create "check" & "cross" labels for context cues
label = createLabel() // Create the label
label.text = "\u{2713}" // Add check symbol as text

super.init(style: style, reuseIdentifier: reuseIdentifier)

addSubview(label)

// Add a pan recognizer
var recognizer = UIPanGestureRecognizer(target: self, action: "handleSwipe:")
recognizer.delegate = self
addGestureRecognizer(recognizer)
}

let cueMargin: CGFloat = 10.0, cueWidth: CGFloat = 50.0

override func layoutSubviews() {

// The label starts out of view
label.frame = CGRect(x: bounds.size.width + cueMargin, y: 0, width: cueWidth, height: bounds.size.height)
}

func handleSwipe(recognizer: UIPanGestureRecognizer) {
let translation = recognizer.translationInView(self)

if recognizer.state == .Changed {
center = CGPointMake(center.x + translation.x, center.y)
startSegue = frame.origin.x < -frame.size.width / 2.0 // If swiped over 50%, return true
label.textColor = startSegue ? UIColor.redColor() : UIColor.whiteColor() // If swiped over 50%, become red
recognizer.setTranslation(CGPointZero, inView: self)
}
if recognizer.state == .Ended {
let originalFrame = CGRect(x: 0, y: frame.origin.y, width: bounds.size.width, height: bounds.size.height)
if delegate != nil {
startSegue ? delegate!.something() : UIView.animateWithDuration(0.2) { self.frame = originalFrame }
}
}
}

// Need this to handle the conflict between vertical swipes of tableviewgesture and pangesture
override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
if let panGestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer {
let velocity = panGestureRecognizer.velocityInView(superview!)
if fabs(velocity.x) >= fabs(velocity.y) { return true }
return false
}
return false
}
}

我从这个 tutorial 得到这个

编辑:在您的 ViewController 中,您必须使用以下方法“注册”此 TableViewCell:

yourTableName.registerClass(TableViewCell.self, forCellReuseIdentifier: "cellIdentifier")

cellForRowAtIndexPathTableViewDataSource 看起来像:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cellIdentifier", forIndexPath: indexPath) as TableViewCell

cell.delegate = self

// Add stuff for your other labels like:
// "cell.name = item.name" etc

return cell
}

如果您想将数据传回ViewController,只需使用委托(delegate)即可。

关于iOS - 类似于 Snapchat 的 UITableViewCell 中的 UIGestureRecognizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29406081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com