使用自动布局时,我更改标签文本时会重置标签位置

时间:2014-11-16 05:01:15

标签: objective-c xcode

我正在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个截图。

4 Screenshots

  1. 第一张图片是故事板 我有一个带有自动布局限制的标签。
  2. 第二张图片是启动应用程序后的屏幕截图。
  3. 第三张图片是用户拖动屏幕时,
    并且标签向下移动以匹配手指。
  4. 释放手指后,第四张图像正好 标签文字已更改。

2 个答案:

答案 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];
}