我正在Objective-c中开发一个非常简单的应用程序 在应用程序中,用户可以通过拖动屏幕来更改标签的位置。
Tap&拖动屏幕,标签上下移动以匹配手指的位置 松开手指时,标签的坐标信息将设置为文本。
但标签位置在文本更改时会重置。
// IBOutlet UILabel *label
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint touch = [[touches anyObject] locationInView:self.view];
label.center = CGPointMake(label.center.x, touch.y);
}
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint touch = [[touches anyObject] locationInView:self.view];
label.center = CGPointMake(label.center.x, touch.y);
}
- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint touch = [[touches anyObject] locationInView:self.view];
label.text = [NSString stringWithFormat:@"y = %f", touch.y];
}
在 touchesEnded 事件中,只需更改标签的文字,
但它的位置已经重置。
我尝试更改 touchesEnded 事件,但未解决问题。
- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint touch = [[touches anyObject] locationInView:self.view];
label.text = [NSString stringWithFormat:@"y = %f", touch.y];
label.center = CGPointMake(label.center.x, touch.y); // add this line
}
我想解决这种奇怪的行为而不取消选中“使用自动布局” 我想继续使用自动布局。
我的应用有4个截图。
答案 0 :(得分:6)
您不能使用自动布局和更改事物的中心/框架;那些是对立的。做其中一个 - 不是两个。
因此,您不必关闭自动布局,但如果您不这样做,那么您必须使用自动布局,并且仅>自动布局,定位事物。
移动标签时,请勿更改其中心 - 更改其约束。或者至少,改变了它的中心,改变它的约束以匹配。
否则,当布局发生时,约束会将其放回到已告知他们的位置。当您更改文本时,以及在许多其他时间,布局会发生。
答案 1 :(得分:0)
OP解决方案。
约束可以被视为故事板上的IBOutlet:
Associating constraints as well as label or other IBOutlet.
// ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController {
IBOutlet UILabel *label;
IBOutlet NSLayoutConstraint *lcLabelTop;
}
@end
// ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];
[self.view addGestureRecognizer:pan];
}
- (void)panAction : (UIPanGestureRecognizer *)sender
{
CGPoint pan = [sender translationInView:self.view];
lcLabelTop.constant += pan.y;
if (sender.state == UIGestureRecognizerStateEnded) {
label.text = [NSString stringWithFormat:@"y = %f", lcLabelTop.constant];
}
[sender setTranslation:CGPointZero inView:self.view];
}