如何动态移动UIView并应用自动布局?

时间:2015-04-21 19:51:47

标签: ios objective-c autolayout

我有UISegmentedcontrol(有2个段)和UIView。由于最小段数为2,我不想隐藏segmentedcontrol并添加UILabel

这就是模拟器中的样子:

enter image description here (红色是UIView。)

这是我的代码:

[self.segment setHidden:YES];

CGRect segmentFrame = self.segment.frame;
segmentFrame.size.width /= 2;

UILabel *myLabel= [[UILabel alloc] initWithFrame:segmentFrame];

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:0];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell.contentView addSubview:myLabel];

正如您在上图所示,我已应用自动布局。隐藏view隐藏并添加label后,view不会移到左侧。所以我尝试以编程方式移动它(在应用自动布局时可能不应该这样做):

CGRect myViewFrame = self.myView.frame;
myViewFrame.origin.x -= segmentFrame.size.width;
self.myView.frame = myViewFrame;

那仍然无效。我的问题是:当view被隐藏时,如何让segmentedcontrol向左移动?

3 个答案:

答案 0 :(得分:2)

如果您使用autolayout,更好的方法是以编程方式修改autolayout constraints

请按照以下步骤操作:

IBOutlet文件中创建viewController.h

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *nameButtonVerticalConstraint;

现在将其与相关的自动布局约束连接起来:

enter image description here

现在您可以像这样简单地更改约束:

self.nameButtonVerticalConstraint.constant=25;

如果你想要更平滑的过渡,你可以把它放在一个动画块中:

[UIView animateWithDuration:1.2 delay:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
    self.nameButtonVerticalConstraint.constant=50;
    [self.view layoutIfNeeded];
} completion:nil];

编辑:这里摘自this文章

  

如果由于更新上述约束而影响其他约束,则还必须调用以下内容:

 [viewForUpdate setNeedsUpdateConstraints];
  

现在,通过在动画块中调用layoutIfNeeded来为视图设置动画。

答案 1 :(得分:1)

为超级视图添加前导空格的约束。在你的.h:

IBOutlet NSLayoutConstraint *leftSpace;

将它从Interface Builder中的“连接”选项卡拖到您为超级视图设置的前导空间约束。无论您何时尝试在.m文件中以编程方式移动它,请将leftSpace属性设置为您想要的宽度,如下所示:

leftSpace.constant = *the width you would like*;

希望有所帮助!

答案 2 :(得分:1)

将分段控件的宽度约束连接到属性并以编程方式将其值更改为0,然后重新布局视图(您可能还希望将分段控件与视图之间的间隙归零 - 使用相同的接近那里)。