我已经构建了一个小型测试应用程序来在 UIButton 上应用平移手势。我成功应用了平移手势并成功移动了按钮。但问题是我什至可以在屏幕外移动按钮。如何将其绑定为仅在 iPhone 屏幕内移动?这是我的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
[panGesture setMinimumNumberOfTouches:1];
[_shareButton addGestureRecognizer:panGesture];
}
-(IBAction)pan:(UIPanGestureRecognizer *)recognizer
{
CGPoint trans =[recognizer translationInView:self.view];
recognizer.view.center = CGPointMake(recognizer.view.center.x+trans.x, recognizer.view.center.y+trans.y);
[recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
}
Run Code Online (Sandbox Code Playgroud)
如何限制按钮移出屏幕?我使用的是 iOS 7,xcode 5.0。
我有以下代码,我的长按不按预期方式工作.任何人都可以弄清楚它为什么不起作用?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: "myButton:")
longPressRecognizer.minimumPressDuration = 0.5
myButton.addGestureRecognizer(longPressRecognizer)
}
@IBOutlet weak var myButton: UIButton!
@IBAction func myButton(longPress: UILongPressGestureRecognizer) {
if longPress.state != .Began {
presentAlertController()
return
}
}
Run Code Online (Sandbox Code Playgroud)
当我按住按钮时出现此错误
2016-01-09 00:41:28.785 longPressTest[1870:551106] Warning: Attempt to present <UIAlertController: 0x144d6a500> on <longPressTest.ViewController: 0x144e3a450> which is already presenting <UIAlertController: 0x144e59d80>
2016-01-09 00:41:28.903 longPressTest[1870:551106] Attempting to load the view of a view …
Run Code Online (Sandbox Code Playgroud) 我一直在尝试在我的 uitableview 上设置一个长按手势识别器。我已经能够注册它,但是它似乎为我提供了不正确的相关行信息。我的 tableview 在正常单击时按预期工作,它通过indexPath.row
,我能够从people
与该行相关联的数组中获取正确的记录。但是在使用下面的代码时,indexPath.row 似乎不一致并选择上方和下方的行,然后在滚动时长按选择随机记录。
func longPress(_ longPressGestureRecognizer: UILongPressGestureRecognizer) {
if longPressGestureRecognizer.state == UIGestureRecognizerState.began {
let touchPoint = longPressGestureRecognizer.location(in: self.view)
if let indexPath = tableView.indexPathForRow(at: touchPoint) {
let person = people[indexPath.row]
print("\(person.name)")
///////works but erratic responses//////////
}
}
}
//// in view did load i have this
let longPressGesture:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(PeopleVC.longPress(_:)))
longPressGesture.minimumPressDuration = 1.0 // 1 second press
longPressGesture.delegate = self
self.tableView.addGestureRecognizer(longPressGesture)
Run Code Online (Sandbox Code Playgroud) 我在网上找到了这段代码,它在平移视图时实现了橡皮筋效果:
@IBAction func viewDragged(sender: UIPanGestureRecognizer) {
let yTranslation = sender.translationInView(view).y
if (hasExceededVerticalLimit(topViewConstraint.constant)){
totalTranslation += yTranslation
topViewConstraint.constant = logConstraintValueForYPoisition(totalTranslation)
if(sender.state == UIGestureRecognizerState.Ended ){
animateViewBackToLimit()
}
} else {
topViewConstraint.constant += yTranslation
}
sender.setTranslation(CGPointZero, inView: view)
}
func logConstraintValueForYPoisition(yPosition : CGFloat) -> CGFloat {
return verticalLimit * (1 + log10(yPosition/verticalLimit))
}
Run Code Online (Sandbox Code Playgroud)
最终效果如下图所示:
但是,我很难理解这段代码的工作原理,也无法在我自己的项目中重现这种效果。例如,我不明白的一件事是,当向上平移绿色视图时yTransition
将为负数,并且负数没有对数(在方法中logConstraintValueForYPoisition(:)
)。如果有人能向我解释这段代码是如何逐步工作的,我将非常感激。
我有一个TableView,它已被编码为在使用该didSelectRowAt
方法选择的任何单元格时执行操作.
现在,我想向表格(或单元格)添加一个向左滑动手势,这样我可以在滑动单元格时执行辅助操作,而不是轻敲单元格.
1)我希望细胞在滑动时向左移动,但我不想在细胞移动的空间中添加按钮.
2)相反,我希望能够将单元格"拖动"到某个点(比如说中途),然后用indexPath执行辅助操作(所以我知道哪个单元被拖动).
3)如果用户停止拖动或放开单元格,我希望它返回到它的起始位置并且不会发生任何操作.
我已经看过很多样本可以做各种各样的部分但是大多数都在Obj-C中,或者在与单元格相同的行中插入按钮.
另外,将Gesture添加到每个单元格中会更好吗?将它添加到表中似乎更聪明......
编辑:请参阅下面的代码完整答案
这很奇怪,但当我添加UIPanGestureRecognizer
一个视图时,它不起作用.这是我的观点,白色视图是红色视图的子视图:
主要观点:
@IBOutlet weak var redView: UIView!
@IBOutlet weak var whiteView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let panRecognizer = UIPanGestureRecognizer(target:self, action:#selector(ViewController.handlePan))
whiteView.gestureRecognizers = [panRecognizer]
}
func handlePan(recognizer:UIPanGestureRecognizer) {
//foo
}
Run Code Online (Sandbox Code Playgroud)
当我点击并拖动白色视图时,它将不会移动.
我的场景中有一个对象,当我在屏幕上移动手指时,我希望该对象沿该方向旋转。它是屏幕上的杯子,在屏幕上滑动手指可以使立方体绕中心点旋转,但不能移动杯子的位置。只要他们积极刷卡,它就应该旋转