gpt4 book ai didi

ios - 在 UIPanGestureRecognizer 处理程序期间动态更新 UIButton 框架

转载 作者:行者123 更新时间:2023-11-30 14:08:26 26 4
gpt4 key购买 nike

在我的 UIPanGestureRecognizer 处理程序内部,我试图让 UIButton 更改其宽度,以便它始终填充向左或向右拉动的单元格留下的空白。

在我的 ifgesture.state == .Changed 分支中,我正在执行以下操作:

let translation = gesture.translationInView(self)
let width = 75 + fabs(translation.x)
self.MarkAsDoneBtn.frame = CGRect(x: self.bounds.size.width, y: 0, width: width, height: 75)

(请原谅神奇的数字)

但是,即使 println(self.MarkAsDoneBtn.frame) 显示宽度调整,按钮的宽度也不会更新(视觉上)。

是否需要额外的东西来强制按钮采用新的帧尺寸?我也尝试过更新 self.MarkAsDoneBtn.bounds 、 self.MarkAsDoneBtn.layer.frame 、 self.MarkAsDoneBtn.layer.bounds 并调用。 ..

self.MarkAsDoneBtn.setNeedsDisplay()
self.MarkAsDoneBtn.setNeedsLayout()
self.MarkAsDoneBtn.setNeedsUpdateConstraints()

...没有运气。

在下面的示例中,绿色箭头表示用户滑动表格单元格的方向,蓝色按钮右侧的红色区域是我尝试通过更改按钮宽度动态填充的区域。

Screen shot

类的精简概述:

import UIKit

class ChoreItemTableViewCell: UITableViewCell {
var MarkAsDoneBtn: UIButton!
var DeleteLabel: UIButton!
var originalCenter = CGPoint()

override func awakeFromNib() {
super.awakeFromNib()

let panGesture = UIPanGestureRecognizer(target: self, action: "handlePan:")
panGesture.delegate = self
addGestureRecognizer(panGesture)

self.MarkAsDoneBtn = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton
self.MarkAsDoneBtn.userInteractionEnabled = true
self.MarkAsDoneBtn.backgroundColor = ColorHelper.instance.getColor("blue")
self.MarkAsDoneBtn.setImage(UIImage(named: "tick"), forState: .Normal)
self.MarkAsDoneBtn.contentMode = UIViewContentMode.Redraw

self.addSubview(self.MarkAsDoneBtn)
}

override func layoutSubviews() {
self.MarkAsDoneBtn.frame = CGRect(x: self.bounds.size.width, y: 0, width: 75, height: 75)
}

func handlePan(gesture: UIPanGestureRecognizer) {
if gesture.state == .Began {
self.originalCenter = center
}

if gesture.state == .Changed {
let translation = gesture.translationInView(self)
center = CGPointMake(self.originalCenter.x + translation.x, self.originalCenter.y)

let width = 75 + fabs(translation.x)
self.MarkAsDoneBtn.frame = CGRect(x: self.bounds.size.width, y: 0, width: width, height: 75)
}

if gesture.state == .Ended {
let originalFrame = CGRect(x: 0, y: frame.origin.y, width: bounds.size.width, height: bounds.size.height)
UIView.animateWithDuration(0.2, animations: { self.frame = originalFrame })
}
}
}

最佳答案

每次移动UIView(以任何方式调整frame属性)时,它都被认为需要布局。因此它的方法layoutSubviews()被调用。

您的ChoreItemTableViewCell具有内置的滑动识别功能。它通过相对于 tableView 移动整个框架来响应滑动,这会导致调用其 layoutSubviews()。 (在那里放一个 print() !)这不太方便地撤消 handlePan() 中的计算。更根本的是,你违反了劳动分工。您的handlePan() 应该只记录翻译状态。然后layoutSubviews()使用平移状态来重新计算 subview 框架。

关于ios - 在 UIPanGestureRecognizer 处理程序期间动态更新 UIButton 框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32063352/

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