我正在尝试使用自定义UITableViewCell类创建一个自定义TableViewController。我需要能够将单元格内的照片拖放到视图底部的面板上。我已经尝试了几种方法来做到这一点,但我遇到了几个问题,还没有在网上找到完整的解决方案:
首先,在拖放之后,我想将UIImage视图返回到它的来源单元格。
其次,我无法在"cellForRowAtIndexPath"方法之外向我的自定义UITableViewClass投射"视图"(因此我可以访问我设置的出口)
这是我的相关代码:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let thisCell:MealPlanTableViewCell = tableView.dequeueReusableCellWithIdentifier("mealPlanCell", forIndexPath: indexPath) as! MealPlanTableViewCell
let meal = mealPlanElementArray[indexPath.row]
thisCell.postTextLabel.text = meal.2
thisCell.foodImageView.image = meal.4
let gesture = UIPanGestureRecognizer(target: self, action: Selector("wasDragged:"))
thisCell.foodImageView.addGestureRecognizer(gesture)
thisCell.foodImageView.userInteractionEnabled = true
return thisCell
}
func wasDragged(gesture: UIPanGestureRecognizer) {
if calendarIsUp == calendarIsUp {
let meal = gesture.view! as! UIImageView
let sview = gesture.view!.superview!.superview!
// CAN'T DO THE FOLLOWING -- CAN'T CAST TO CUSTOM CELL
let mptvc:MealPlanTableViewCell = gesture.view!.superview!.superview! as! MealPlanTableViewCell
if beginningDrag == true
{
beginningDrag = false
// Move
meal.superview?.superview?.superview?.superview?.superview?.superview?.superview?.addSubview(meal)
beforeDragX = (meal.center.x)
beforeDragY = (meal.bounds.maxY)
}
let translation = gesture.translationInView(self.view)
meal.center = CGPoint(x: beforeDragX + translation.x, y: beforeDragY + translation.y)
if gesture.state == UIGestureRecognizerState.Ended {
beginningDrag = true
// NEED TO ADD BACK TO custom UITableViewCell class.
sview.addSubview(meal)
meal.center = CGPoint(x: beforeDragX, y: beforeDragY)
}
}
谢谢你的帮助。。。
拖放后,我想将UIImage视图返回到它来自哪个牢房。
- 使用
transform
属性来操纵CCD_ 2 - 当
UIGestureRecognizer
的状态==UIGestureRecognizerState.Ended
时,实例化一个新的UIImageView
,并将foodImageView
映像分配给新的UIImageView
的image
属性 - 将新的
UIImageView
添加到所需的视图中 - 将
foodImageView
的变换设置为CGAffineTransformIdentity
并设置其动画
作为一个学习练习,我将把编码留给你。为了参考,这里有一个关于CGAffineTransform的很好的解释:揭开CGAffinetTransform的神秘面纱。
我无法在外部将"视图"强制转换为我的自定义UITableViewClass"cellForRowAtIndexPath"方法(因此我将有权访问我已经建立了网点。)
不是将UIPanGestureRecognizer
添加到foodImageView
,而是将其添加到自定义UITableViewCell
。然后,在wasDragged
函数中,访问UIGestureRecognizer.view
(即自定义UITableViewCell
),然后访问foodImageView
属性。这将完全消除访问superview
属性的需要。访问UIKit框架中UI元素的superview属性从来都不是一个好主意,因为苹果可以随时决定更改视图层次结构的结构。最终,你基本上是在猜测你将使用哪个视图,并导致你未来的自我头痛。
示例
func wasDragged(gesture: UIPanGestureRecognizer)
{
if calendarIsUp == calendarIsUp
{
let cell = gesture.view! as! MealPlanTableViewCell
if beginningDrag
{
beginningDrag = false
beforeDragX = cell.foodImageView.center.x
beforeDragY = cell.foodImageView.bounds.maxY
// Move
/*
I have no idea what view this is so I don't know what to change it to.
*/
cell.foodImageView.superview?.superview?.superview?.superview?.superview?.superview?.superview?.addSubview(cell.foodImageView)
}
let translation = gesture.translationInView(self.view)
cell.foodImageView.center = CGPoint(x: beforeDragX + translation.x, y: beforeDragY + translation.y)
if gesture.state == UIGestureRecognizerState.Ended
{
beginningDrag = true
// NEED TO ADD BACK TO custom UITableViewCell class.
cell.contentView.addSubview(cell.foodImageView)
cell.foodImageView.center = CGPoint(x: beforeDragX, y: beforeDragY)
}
}
}