使用约束而不是设置框架来移动控件

时间:2014-10-24 20:52:37

标签: ios objective-c uiviewcontroller interface-builder constraints

我已经构建了一个应用程序,其中UISegmentedControl需要根据其选定的索引进行移动。我正在使用此代码来实现:

- (IBAction)segmentControlAction:(id)sender {
// Change which container will be visible
int selectedIndex = self.overviewSegmentControl.selectedSegmentIndex;

if (selectedIndex == 0) {
    // Show details and hide reviews & related

    // SHOW THE DETAILS
    [self showDetails];
} else if (selectedIndex == 1) {
    // Show Reviews and hide details & related

    // SHOW THE REVIEWS
    [self showOther];
} else if (selectedIndex == 2) {
    // Show related and hide details & reviews
}
}

-(void)showOther {
// Animate the reviews
[UIView animateWithDuration:.5 delay:0 usingSpringWithDamping:.9 initialSpringVelocity:1 options:UIViewAnimationOptionTransitionNone animations:^{
    // Hide details controls
    self.profileImageView.alpha = 0;
    self.seperatorImageView.alpha = 0;
    self.byLabel.alpha = 0;
    self.authorLabel.alpha = 0;

    // Move segmentControl
    [self.overviewSegmentControl setFrame:CGRectMake(self.overviewSegmentControl.frame.origin.x, self.previewImageView.frame.size.height + 8, self.overviewSegmentControl.frame.size.width, self.overviewSegmentControl.frame.size.height)];
}completion:^(BOOL finished) {
    // Completed
}];
}

-(void)showDetails{
// Animate the details
[UIView animateWithDuration:.5 delay:0 usingSpringWithDamping:.9 initialSpringVelocity:1 options:UIViewAnimationOptionTransitionNone animations:^{
    // Move segmentControl
    [self.overviewSegmentControl setFrame:CGRectMake(self.overviewSegmentControl.frame.origin.x, self.previewImageView.frame.size.height + 85, self.overviewSegmentControl.frame.size.width, self.overviewSegmentControl.frame.size.height)];

    // Hide details controls
    self.profileImageView.alpha = 1;
    self.seperatorImageView.alpha = 1;
    self.byLabel.alpha = 1;
    self.authorLabel.alpha = 1;
}completion:^(BOOL finished) {
    // Completed
}];
}

此代码移动UISegmentedControl,但在执行实际移动之前将其恢复为原始位置。这导致控件的奇怪跳跃。

我的UIViewController:

enter image description here

在这里你可以看到我的约束:

enter image description here enter image description here

有人可以解释一下这是如何工作的以及如何使用约束移动控件而不是设置框架?

谢谢! 埃里克

2 个答案:

答案 0 :(得分:1)

您可以在运行时以编程方式修改约束对象的“.constant”属性,以设置定位和/或大小值。您可以在视图控制器的updateConstraints方法中执行此操作。

您可以将故事板中的约束绑定到代码中的属性,就像绑定其他对象一样:按住Control键并从对象拖动到源代码窗口。然后,您可以在运行时访问它们。

此外,请确保将translatesAutoresizingMaskIntoConstraints设置为FALSE,否则您可能会遇到冲突限制。

答案 1 :(得分:0)

例如,您可以设置"从您的分段控制器到顶部的约束:"顶部空间"并相应地修改此约束。

这里有一个示例testMovingControll