像以前一样刷新 ViewController
Refresh the ViewController as is before
我正在使用 Swift 2,我被困在一件事上。
我有一个 TableViewController,我将一个 UIView 放在一个单元格中以产生可滑动的效果,并分配自定义单元格 class。
我有一个 SWRevealViewController。
首先我滑动单元格,然后我打开 RevealView 边栏菜单。
现在,当我打开侧边栏菜单时,单元格不会恢复正常。
谁能帮帮我
点击here!
此图像向您展示了我所做的滑动效果。
点击here!
现在在这张图片中你可以清楚地看到当我打开侧边栏菜单时单元格没有关闭
在我的 SwipeCell 自定义 class 中,我使用约束出口来更改 UIView 的状态。
*import UIKit
protocol SwipeableCellDelegate: UIGestureRecognizerDelegate
{
func buttonOneActionForItemText(itemText : Int ,myIndexPath : NSIndexPath)
func buttonTwoActionForItemText(itemText : Int,myIndexPath : NSIndexPath)
func buttonThreeActionForItemText(itemText : Int,myIndexPath : NSIndexPath)
}
class SwipeableCellTableViewCell: UITableViewCell {
@IBOutlet weak var myview: UIView!
var panRecognizer: UIPanGestureRecognizer!
var panStartPoint : CGPoint!
var startingRightLayoutConstraintConstant : CGFloat!
@IBOutlet weak var contentViewRightConstraint : NSLayoutConstraint!
@IBOutlet weak var contentViewLeftConstraint : NSLayoutConstraint!
var halfOfButtonOne: CGFloat!
@IBOutlet weak var deleteButton: UIButton!
@IBOutlet weak var seeButton: UIButton!
@IBOutlet weak var confirmButton: UIButton!
var delegate: SwipeableCellDelegate?
var itemText : Int?
let kBounceValue: CGFloat = 20.0
var myIndexPath : NSIndexPath!
override func awakeFromNib() {
super.awakeFromNib()
self.panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.panThisCell))
self.panRecognizer.delegate = self
self.myview.addGestureRecognizer(self.panRecognizer)
}
func panThisCell(recognizer: UIPanGestureRecognizer) {
switch recognizer.state {
case .Began:
self.panStartPoint = recognizer.translationInView(self.myview)
self.startingRightLayoutConstraintConstant = self.contentViewRightConstraint.constant
print("Pan Began at \(NSStringFromCGPoint(self.panStartPoint))")
case .Changed:
let currentPoint = recognizer.translationInView(self.myview)
let deltaX: CGFloat = currentPoint.x - self.panStartPoint.x
var panningLeft = false
if currentPoint.x < self.panStartPoint.x {
//1
panningLeft = true
}
if self.startingRightLayoutConstraintConstant == 0
{
//2
//The cell was closed and is now opening
if !panningLeft {
let constant: CGFloat = max(-deltaX, 0)
//3
if constant == 0 {
//4
self.resetConstraintContstantsToZero(true, notifyDelegateDidClose: false)
}
else {
//5
print("changed5: \(constant)")
self.contentViewRightConstraint.constant = constant
}
}
else {
let constant: CGFloat = min(-deltaX, self.buttonTotalWidth())
//6
if constant == self.buttonTotalWidth() {
//7
self.setConstraintsToShowAllButtons(true, notifyDelegateDidOpen: false)
}
else {
//8
print("changed8: \(constant)")
self.contentViewRightConstraint.constant = constant
}
}
}
else
{
//The cell was at least partially open.
var adjustment: CGFloat = self.startingRightLayoutConstraintConstant - deltaX
//1
if !panningLeft {
var constant: CGFloat = max(adjustment, 0)
//2
if constant == 0 {
//3
self.resetConstraintContstantsToZero(true, notifyDelegateDidClose: false)
}
else {
//4
print("changed4: \(constant)")
self.contentViewRightConstraint.constant = constant
}
}
else {
var constant: CGFloat = min(adjustment, self.buttonTotalWidth())
//5
if constant == self.buttonTotalWidth() {
//6
self.setConstraintsToShowAllButtons(true, notifyDelegateDidOpen: false)
}
else {
//7
print("changed7: \(constant)")
self.contentViewRightConstraint.constant = constant
}
}
}
self.contentViewLeftConstraint.constant = -self.contentViewRightConstraint.constant
//8
case .Ended:
if self.startingRightLayoutConstraintConstant == 0 {
//1
//Cell was opening
halfOfButtonOne = CGRectGetWidth(self.deleteButton.frame) / 2
//2
if self.contentViewRightConstraint.constant >= halfOfButtonOne {
//3
//Open all the way
self.setConstraintsToShowAllButtons(true, notifyDelegateDidOpen: true)
}
else {
//Re-close
self.resetConstraintContstantsToZero(true, notifyDelegateDidClose: true)
}
}
else if startingRightLayoutConstraintConstant <= halfOfButtonOne
{
//Cell was closing
var buttonOnePlusHalfOfButton2: CGFloat = CGRectGetWidth(self.deleteButton.frame) + (CGRectGetWidth(self.seeButton.frame) / 2)
//4
if self.contentViewRightConstraint.constant >= buttonOnePlusHalfOfButton2 {
//5
//Re-open all the way
self.setConstraintsToShowAllButtons(true, notifyDelegateDidOpen: true)
}
else {
//Close
self.resetConstraintContstantsToZero(true, notifyDelegateDidClose: true)
}
}
else
{
//Cell was closing
var buttonOnePlusHalfOfButton3: CGFloat = CGRectGetWidth(self.deleteButton.frame) + CGRectGetWidth(self.seeButton.frame) + (CGRectGetWidth(self.confirmButton.frame)/2)
//4
if self.contentViewRightConstraint.constant >= buttonOnePlusHalfOfButton3 {
//5
//Re-open all the way
self.setConstraintsToShowAllButtons(true, notifyDelegateDidOpen: true)
}
else {
//Close
self.resetConstraintContstantsToZero(true, notifyDelegateDidClose: true)
}
}
print("Pan Ended")
case .Cancelled:
if self.startingRightLayoutConstraintConstant == 0 {
//Cell was closed - reset everything to 0
self.resetConstraintContstantsToZero(true, notifyDelegateDidClose: true)
}
else {
//Cell was open - reset to the open state
self.setConstraintsToShowAllButtons(true, notifyDelegateDidOpen: true)
}
print("Pan Cancelled")
default:
break
}
}
func updateConstraintsIfNeeded(animated: Bool, completion: (finished: Bool) -> Void) {
var duration: Float = 0
if animated {
duration = 0.1
}
UIView.animateWithDuration(Double(duration), delay: 0, options: .CurveEaseOut, animations: {() -> Void in
self.layoutIfNeeded()
}, completion: completion)
}
//Set COnstraint
func setConstraintsToShowAllButtons(animated: Bool, notifyDelegateDidOpen notifyDelegate: Bool)
{
//TODO: Notify delegate.
if notifyDelegate {
// self.delegate!.cellDidOpen(self)
}
//1
if self.startingRightLayoutConstraintConstant == self.buttonTotalWidth() && self.contentViewRightConstraint.constant == self.buttonTotalWidth() {
return
}
//2
self.contentViewLeftConstraint.constant = -self.buttonTotalWidth() - kBounceValue
self.contentViewRightConstraint.constant = self.buttonTotalWidth() + kBounceValue
self.updateConstraintsIfNeeded(animated, completion: {(finished: Bool) -> Void in
//3
self.contentViewLeftConstraint.constant = -self.buttonTotalWidth()
self.contentViewRightConstraint.constant = self.buttonTotalWidth() //check1
self.updateConstraintsIfNeeded(animated, completion: {(finished: Bool) -> Void in
//4
self.startingRightLayoutConstraintConstant = self.contentViewRightConstraint.constant
})
})
}
//Reset Constraints
func resetConstraintContstantsToZero(animated: Bool, notifyDelegateDidClose notifyDelegate: Bool)
{
if notifyDelegate {
//self.delegate!.cellDidClose(self)
}
//TODO: Notify delegate.
// if self.startingRightLayoutConstraintConstant == 0 && self.contentViewRightConstraint.constant == 0 {
// //Already all the way closed, no bounce necessary
// return
// }
self.contentViewRightConstraint.constant = -kBounceValue
self.contentViewLeftConstraint.constant = kBounceValue
self.updateConstraintsIfNeeded(animated, completion: {(finished: Bool) -> Void in
self.contentViewRightConstraint.constant = 0
self.contentViewLeftConstraint.constant = 0
self.updateConstraintsIfNeeded(animated, completion: {(finished: Bool) -> Void in
self.startingRightLayoutConstraintConstant = self.contentViewRightConstraint.constant
})
})
}
func buttonTotalWidth() -> CGFloat {
return CGRectGetWidth(self.frame) - CGRectGetMinX(self.confirmButton.frame)
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
@IBAction func buttonClicked(sender: AnyObject)
{
if sender as! NSObject == self.deleteButton {
self.delegate?.buttonOneActionForItemText(itemText! ,myIndexPath: myIndexPath)
print("Clicked delete 1!")
}
else if sender as! NSObject == self.seeButton {
self.delegate!.buttonTwoActionForItemText(itemText!,myIndexPath: myIndexPath)
print("Clicked see 2!")
}
else {
self.delegate!.buttonThreeActionForItemText(itemText!,myIndexPath: myIndexPath)
print("Clicked confirm button!")
}
}
}
TableViewCellForRow:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! SwipeableCellTableViewCell
let temp = requestedUserInfo[indexPath.row]
var username = cell.viewWithTag(100) as! UILabel
var profile = cell.viewWithTag(101) as! UIImageView
let url = temp.imageUrl[0]
//print("uname: \(temp.uName)")
username.text = temp.uName
profile.kf_setImageWithURL(NSURL(string: url))
cell.myIndexPath = indexPath
cell.itemText = indexPath.row
cell.delegate = self
// if self.cellsCurrentlyEditing.contains(indexPath) {
// cell.openCell()
// }
return cell
}
这是 viewdidLoad 代码:
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.translucent = false
if revealViewController() != nil {
//revealViewController().rearViewRevealWidth = 62
sidebarButton.target = revealViewController()
sidebarButton.action = #selector(SWRevealViewController.revealToggle(_:))
revealViewController().rightViewRevealWidth = self.view.frame.width-64
rightReveal.target = revealViewController()
rightReveal.action = #selector(SWRevealViewController.rightRevealToggle(_:))
view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
self.view.addGestureRecognizer(self.revealViewController().tapGestureRecognizer())
}
self.refreshControl?.attributedTitle = NSAttributedString(string: "Pull to refresh")
self.refreshControl?.addTarget(self, action: #selector(FriendRequestTableViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged)
if NSUserDefaults.standardUserDefaults().valueForKey(KEY_UID) != nil {
self.showRequests()
}
}
看来您在重新加载 tableview 时没有重置约束。您可以在 cellForRowAtIndexPath()
中执行类似的操作
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! SwipeableCellTableViewCell
...
cell.myIndexPath = indexPath
cell.itemText = indexPath.row
cell.delegate = self
cell.resetConstraintContstantsToZero(true, notifyDelegateDidClose: false)
return cell
}
您可能想在设置动画之前检查您的单元格是否已在 resetConstraintContstantsToZero()
函数中关闭。
顺便说一句,你可能想看看这个:
我正在使用 Swift 2,我被困在一件事上。
我有一个 TableViewController,我将一个 UIView 放在一个单元格中以产生可滑动的效果,并分配自定义单元格 class。
我有一个 SWRevealViewController。
首先我滑动单元格,然后我打开 RevealView 边栏菜单。 现在,当我打开侧边栏菜单时,单元格不会恢复正常。
谁能帮帮我
点击here! 此图像向您展示了我所做的滑动效果。
点击here! 现在在这张图片中你可以清楚地看到当我打开侧边栏菜单时单元格没有关闭
在我的 SwipeCell 自定义 class 中,我使用约束出口来更改 UIView 的状态。
*import UIKit
protocol SwipeableCellDelegate: UIGestureRecognizerDelegate
{
func buttonOneActionForItemText(itemText : Int ,myIndexPath : NSIndexPath)
func buttonTwoActionForItemText(itemText : Int,myIndexPath : NSIndexPath)
func buttonThreeActionForItemText(itemText : Int,myIndexPath : NSIndexPath)
}
class SwipeableCellTableViewCell: UITableViewCell {
@IBOutlet weak var myview: UIView!
var panRecognizer: UIPanGestureRecognizer!
var panStartPoint : CGPoint!
var startingRightLayoutConstraintConstant : CGFloat!
@IBOutlet weak var contentViewRightConstraint : NSLayoutConstraint!
@IBOutlet weak var contentViewLeftConstraint : NSLayoutConstraint!
var halfOfButtonOne: CGFloat!
@IBOutlet weak var deleteButton: UIButton!
@IBOutlet weak var seeButton: UIButton!
@IBOutlet weak var confirmButton: UIButton!
var delegate: SwipeableCellDelegate?
var itemText : Int?
let kBounceValue: CGFloat = 20.0
var myIndexPath : NSIndexPath!
override func awakeFromNib() {
super.awakeFromNib()
self.panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.panThisCell))
self.panRecognizer.delegate = self
self.myview.addGestureRecognizer(self.panRecognizer)
}
func panThisCell(recognizer: UIPanGestureRecognizer) {
switch recognizer.state {
case .Began:
self.panStartPoint = recognizer.translationInView(self.myview)
self.startingRightLayoutConstraintConstant = self.contentViewRightConstraint.constant
print("Pan Began at \(NSStringFromCGPoint(self.panStartPoint))")
case .Changed:
let currentPoint = recognizer.translationInView(self.myview)
let deltaX: CGFloat = currentPoint.x - self.panStartPoint.x
var panningLeft = false
if currentPoint.x < self.panStartPoint.x {
//1
panningLeft = true
}
if self.startingRightLayoutConstraintConstant == 0
{
//2
//The cell was closed and is now opening
if !panningLeft {
let constant: CGFloat = max(-deltaX, 0)
//3
if constant == 0 {
//4
self.resetConstraintContstantsToZero(true, notifyDelegateDidClose: false)
}
else {
//5
print("changed5: \(constant)")
self.contentViewRightConstraint.constant = constant
}
}
else {
let constant: CGFloat = min(-deltaX, self.buttonTotalWidth())
//6
if constant == self.buttonTotalWidth() {
//7
self.setConstraintsToShowAllButtons(true, notifyDelegateDidOpen: false)
}
else {
//8
print("changed8: \(constant)")
self.contentViewRightConstraint.constant = constant
}
}
}
else
{
//The cell was at least partially open.
var adjustment: CGFloat = self.startingRightLayoutConstraintConstant - deltaX
//1
if !panningLeft {
var constant: CGFloat = max(adjustment, 0)
//2
if constant == 0 {
//3
self.resetConstraintContstantsToZero(true, notifyDelegateDidClose: false)
}
else {
//4
print("changed4: \(constant)")
self.contentViewRightConstraint.constant = constant
}
}
else {
var constant: CGFloat = min(adjustment, self.buttonTotalWidth())
//5
if constant == self.buttonTotalWidth() {
//6
self.setConstraintsToShowAllButtons(true, notifyDelegateDidOpen: false)
}
else {
//7
print("changed7: \(constant)")
self.contentViewRightConstraint.constant = constant
}
}
}
self.contentViewLeftConstraint.constant = -self.contentViewRightConstraint.constant
//8
case .Ended:
if self.startingRightLayoutConstraintConstant == 0 {
//1
//Cell was opening
halfOfButtonOne = CGRectGetWidth(self.deleteButton.frame) / 2
//2
if self.contentViewRightConstraint.constant >= halfOfButtonOne {
//3
//Open all the way
self.setConstraintsToShowAllButtons(true, notifyDelegateDidOpen: true)
}
else {
//Re-close
self.resetConstraintContstantsToZero(true, notifyDelegateDidClose: true)
}
}
else if startingRightLayoutConstraintConstant <= halfOfButtonOne
{
//Cell was closing
var buttonOnePlusHalfOfButton2: CGFloat = CGRectGetWidth(self.deleteButton.frame) + (CGRectGetWidth(self.seeButton.frame) / 2)
//4
if self.contentViewRightConstraint.constant >= buttonOnePlusHalfOfButton2 {
//5
//Re-open all the way
self.setConstraintsToShowAllButtons(true, notifyDelegateDidOpen: true)
}
else {
//Close
self.resetConstraintContstantsToZero(true, notifyDelegateDidClose: true)
}
}
else
{
//Cell was closing
var buttonOnePlusHalfOfButton3: CGFloat = CGRectGetWidth(self.deleteButton.frame) + CGRectGetWidth(self.seeButton.frame) + (CGRectGetWidth(self.confirmButton.frame)/2)
//4
if self.contentViewRightConstraint.constant >= buttonOnePlusHalfOfButton3 {
//5
//Re-open all the way
self.setConstraintsToShowAllButtons(true, notifyDelegateDidOpen: true)
}
else {
//Close
self.resetConstraintContstantsToZero(true, notifyDelegateDidClose: true)
}
}
print("Pan Ended")
case .Cancelled:
if self.startingRightLayoutConstraintConstant == 0 {
//Cell was closed - reset everything to 0
self.resetConstraintContstantsToZero(true, notifyDelegateDidClose: true)
}
else {
//Cell was open - reset to the open state
self.setConstraintsToShowAllButtons(true, notifyDelegateDidOpen: true)
}
print("Pan Cancelled")
default:
break
}
}
func updateConstraintsIfNeeded(animated: Bool, completion: (finished: Bool) -> Void) {
var duration: Float = 0
if animated {
duration = 0.1
}
UIView.animateWithDuration(Double(duration), delay: 0, options: .CurveEaseOut, animations: {() -> Void in
self.layoutIfNeeded()
}, completion: completion)
}
//Set COnstraint
func setConstraintsToShowAllButtons(animated: Bool, notifyDelegateDidOpen notifyDelegate: Bool)
{
//TODO: Notify delegate.
if notifyDelegate {
// self.delegate!.cellDidOpen(self)
}
//1
if self.startingRightLayoutConstraintConstant == self.buttonTotalWidth() && self.contentViewRightConstraint.constant == self.buttonTotalWidth() {
return
}
//2
self.contentViewLeftConstraint.constant = -self.buttonTotalWidth() - kBounceValue
self.contentViewRightConstraint.constant = self.buttonTotalWidth() + kBounceValue
self.updateConstraintsIfNeeded(animated, completion: {(finished: Bool) -> Void in
//3
self.contentViewLeftConstraint.constant = -self.buttonTotalWidth()
self.contentViewRightConstraint.constant = self.buttonTotalWidth() //check1
self.updateConstraintsIfNeeded(animated, completion: {(finished: Bool) -> Void in
//4
self.startingRightLayoutConstraintConstant = self.contentViewRightConstraint.constant
})
})
}
//Reset Constraints
func resetConstraintContstantsToZero(animated: Bool, notifyDelegateDidClose notifyDelegate: Bool)
{
if notifyDelegate {
//self.delegate!.cellDidClose(self)
}
//TODO: Notify delegate.
// if self.startingRightLayoutConstraintConstant == 0 && self.contentViewRightConstraint.constant == 0 {
// //Already all the way closed, no bounce necessary
// return
// }
self.contentViewRightConstraint.constant = -kBounceValue
self.contentViewLeftConstraint.constant = kBounceValue
self.updateConstraintsIfNeeded(animated, completion: {(finished: Bool) -> Void in
self.contentViewRightConstraint.constant = 0
self.contentViewLeftConstraint.constant = 0
self.updateConstraintsIfNeeded(animated, completion: {(finished: Bool) -> Void in
self.startingRightLayoutConstraintConstant = self.contentViewRightConstraint.constant
})
})
}
func buttonTotalWidth() -> CGFloat {
return CGRectGetWidth(self.frame) - CGRectGetMinX(self.confirmButton.frame)
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
@IBAction func buttonClicked(sender: AnyObject)
{
if sender as! NSObject == self.deleteButton {
self.delegate?.buttonOneActionForItemText(itemText! ,myIndexPath: myIndexPath)
print("Clicked delete 1!")
}
else if sender as! NSObject == self.seeButton {
self.delegate!.buttonTwoActionForItemText(itemText!,myIndexPath: myIndexPath)
print("Clicked see 2!")
}
else {
self.delegate!.buttonThreeActionForItemText(itemText!,myIndexPath: myIndexPath)
print("Clicked confirm button!")
}
}
}
TableViewCellForRow:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! SwipeableCellTableViewCell
let temp = requestedUserInfo[indexPath.row]
var username = cell.viewWithTag(100) as! UILabel
var profile = cell.viewWithTag(101) as! UIImageView
let url = temp.imageUrl[0]
//print("uname: \(temp.uName)")
username.text = temp.uName
profile.kf_setImageWithURL(NSURL(string: url))
cell.myIndexPath = indexPath
cell.itemText = indexPath.row
cell.delegate = self
// if self.cellsCurrentlyEditing.contains(indexPath) {
// cell.openCell()
// }
return cell
}
这是 viewdidLoad 代码:
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.translucent = false
if revealViewController() != nil {
//revealViewController().rearViewRevealWidth = 62
sidebarButton.target = revealViewController()
sidebarButton.action = #selector(SWRevealViewController.revealToggle(_:))
revealViewController().rightViewRevealWidth = self.view.frame.width-64
rightReveal.target = revealViewController()
rightReveal.action = #selector(SWRevealViewController.rightRevealToggle(_:))
view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
self.view.addGestureRecognizer(self.revealViewController().tapGestureRecognizer())
}
self.refreshControl?.attributedTitle = NSAttributedString(string: "Pull to refresh")
self.refreshControl?.addTarget(self, action: #selector(FriendRequestTableViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged)
if NSUserDefaults.standardUserDefaults().valueForKey(KEY_UID) != nil {
self.showRequests()
}
}
看来您在重新加载 tableview 时没有重置约束。您可以在 cellForRowAtIndexPath()
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! SwipeableCellTableViewCell
...
cell.myIndexPath = indexPath
cell.itemText = indexPath.row
cell.delegate = self
cell.resetConstraintContstantsToZero(true, notifyDelegateDidClose: false)
return cell
}
您可能想在设置动画之前检查您的单元格是否已在 resetConstraintContstantsToZero()
函数中关闭。
顺便说一句,你可能想看看这个: