使用 UIPanGestureRecognizer 的可拖动视图中的动作元素导致视图移动
Action Elements in a draggable view using UIPanGestureRecognizer causes the view to shift
我想创建一个包含许多动作元素的可拖动视图。为此,我通过 Apple 文档复制了用于从 here.
创建可拖动视图的代码
视图按预期平移,但当单击操作元素时,视图会移动到其他位置。下面是示例代码和 Main.storyboard 的屏幕截图以重现该问题。
ViewController.h 文件
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
- (IBAction)segmentedAction:(id)sender;
@property (weak, nonatomic) IBOutlet UISegmentedControl *segmentOutlet;
@property (weak, nonatomic) IBOutlet UILabel *label;
@end
这是 ViewController.m 文件中的代码
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
UIView *piece = gestureRecognizer.view;
CGPoint locationInView = [gestureRecognizer locationInView:piece];
CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview];
piece.layer.anchorPoint = CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height);
piece.center = locationInSuperview;
}
}
- (IBAction)panPiece:(UIPanGestureRecognizer *)gestureRecognizer
{
UIView *piece = [gestureRecognizer view];
[self adjustAnchorPointForGestureRecognizer:gestureRecognizer];
if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
CGPoint translation = [gestureRecognizer translationInView:self.view];
[piece setCenter:CGPointMake([piece center].x + translation.x, [piece center].y + translation.y)];
[gestureRecognizer setTranslation:CGPointZero inView:self.view];
}
}
- (IBAction)segmentedAction:(id)sender {
self.label.text = [NSString stringWithFormat:@"%ld",self.segmentOutlet.selectedSegmentIndex];
}
@end
任何人都可以指导我这里做错了什么。
提前致谢
好的,终于解决问题了。这是由于自动布局而发生的。当您尝试设置标签的文本时,自动布局会强制视图框架重置为初始值。由于您更改了锚点,它似乎会移动到某个随机位置。
要解决此问题,只需在 viewDidLoad 方法中使用以下行即可;
self.label.translatesAutoresizingMaskIntoConstraints = YES;
或在 adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
方法中的 UIView *piece = gestureRecognizer.view;
下面添加以下行:-
piece.translatesAutoresizingMaskIntoConstraints = YES;
干杯!:-)
我想创建一个包含许多动作元素的可拖动视图。为此,我通过 Apple 文档复制了用于从 here.
创建可拖动视图的代码视图按预期平移,但当单击操作元素时,视图会移动到其他位置。下面是示例代码和 Main.storyboard 的屏幕截图以重现该问题。
ViewController.h 文件
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
- (IBAction)segmentedAction:(id)sender;
@property (weak, nonatomic) IBOutlet UISegmentedControl *segmentOutlet;
@property (weak, nonatomic) IBOutlet UILabel *label;
@end
这是 ViewController.m 文件中的代码
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
UIView *piece = gestureRecognizer.view;
CGPoint locationInView = [gestureRecognizer locationInView:piece];
CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview];
piece.layer.anchorPoint = CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height);
piece.center = locationInSuperview;
}
}
- (IBAction)panPiece:(UIPanGestureRecognizer *)gestureRecognizer
{
UIView *piece = [gestureRecognizer view];
[self adjustAnchorPointForGestureRecognizer:gestureRecognizer];
if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
CGPoint translation = [gestureRecognizer translationInView:self.view];
[piece setCenter:CGPointMake([piece center].x + translation.x, [piece center].y + translation.y)];
[gestureRecognizer setTranslation:CGPointZero inView:self.view];
}
}
- (IBAction)segmentedAction:(id)sender {
self.label.text = [NSString stringWithFormat:@"%ld",self.segmentOutlet.selectedSegmentIndex];
}
@end
任何人都可以指导我这里做错了什么。
提前致谢
好的,终于解决问题了。这是由于自动布局而发生的。当您尝试设置标签的文本时,自动布局会强制视图框架重置为初始值。由于您更改了锚点,它似乎会移动到某个随机位置。
要解决此问题,只需在 viewDidLoad 方法中使用以下行即可;
self.label.translatesAutoresizingMaskIntoConstraints = YES;
或在 adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
方法中的 UIView *piece = gestureRecognizer.view;
下面添加以下行:-
piece.translatesAutoresizingMaskIntoConstraints = YES;
干杯!:-)