使用 IOS 中的约束将 UIView 中的子视图居中

Posted

技术标签:

【中文标题】使用 IOS 中的约束将 UIView 中的子视图居中【英文标题】:Center the subview in UIView using constraints in IOS 【发布时间】:2017-08-24 10:32:59 【问题描述】:

我在UIViewController 中的UIView 中有三个子视图,例如 subview1、subview2、subview3。

我正在对它们使用约束,当单击按钮时,我用来在中心显示的约束是这些,

水平放置在容器中, 垂直放置在容器中, 宽度和 身高。

问题:

当我运行应用程序并单击button 时,它位于正确的位置。但是当我关闭它并再次尝试打开它时,subview 会自行更改其位置并出现在UIViewcontroller左上角

正如您在屏幕截图中看到的那样,但我希望每次单击UIViewcontroller中心 中的按钮时都显示view

我很困惑约束是正确的,但是为什么当我们再次打开它时它总是改变它的位置。

我的代码是,

    - (IBAction)Precord:(id)sender 

       _DateView.hidden=NO;
        [self.DateView bounceIntoView:self.view direction:DCAnimationDirectionLeft];
    

故事板的内容是这样的, enter image description here

【问题讨论】:

您需要刷新布局约束。单击按钮后,尝试 yourView.layoutIfNeeded() 您创建的布局约束会将子视图置于中心。第一次正确显示。关闭视图并再次添加到父视图后,不应用子视图约束。所以通过在子视图上调用 layoutIfNeeded() 方法来刷新它们。 请显示一些代码,以便我们更好地帮助您,您是通过编程方式设置约束还是使用情节提要? @Oneeb 给我看你的这个 UIViewController 的故事板。以及您的 View Hierarchy 结构和约束。 在[self.DateViewbounceIntoView:self.view direction:DCAnimationDirectionLeft]之后添加self.DateView.layoutIfNeeded();行并检查 【参考方案1】:

这取决于您关闭视图的方式。我刚刚尝试了下面的代码,它对我有用

- (IBAction)btn_Tapped:(id)sender 
_smallView.hidden = false;
[_smallView bounceIntoView:self.view direction:DCAnimationDirectionLeft];

 - (IBAction)hide_Tapped:(id)sender 
_smallView.hidden = true;

基本上我只是隐藏视图。当 btn_Tapped 时,每次视图都在中心显示弹跳动画。告诉我你的进展情况!

【讨论】:

它改变了它的药水。 @Deepika 我自己试过这段代码,它并没有改变我的位置。您是否随时从其 parentView 中删除该视图? 不,我不是,但我使用了动画,当我首先单击按钮时,它会出现在正确的位置,然后会出现在左上角。 @Deepika【参考方案2】:

试试这个

yourSubView.center = CGPointMake(yourMainView.frame.size.width  / 2, 
                             yourMainView.frame.size.height / 2);

【讨论】:

你也给了这个框架 我刚刚创建了一个子视图并将其居中定位并应用了约束,我也为这个子视图使用了动画。 @Vikas Rajput【参考方案3】:

以编程方式添加约束的简单方法。用你想要的大小修改它。

注意1:toItem:self,其中self只是你添加子视图的一个视图。

注意 2:必须将 SubView 添加到 self 或 self 的 subView。

subView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint(item: subView, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier: 1.0, constant: 0).isActive = true
NSLayoutConstraint(item: subView, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1.0, constant: 0).isActive = true
NSLayoutConstraint(item: subView, attribute: .height,  relatedBy: .equal, toItem: self, attribute: .height,  multiplier: 0.5, constant: 0).isActive = true
NSLayoutConstraint(item: subView, attribute: .width,   relatedBy: .equal, toItem: self, attribute: .width,   multiplier: 0.5, constant: 0).isActive = true

我建议在 Storyboard 中添加约束。更易于查看/阅读、清除代码和错误验证器。

关于你的问题,我会说这是一个动画问题。在添加视图之前再次运行设置视图框架/约束的方法(以重置动画位置修改)。

或者只是在动画完成时,而不是隐藏视图,而是将其从超级视图中删除。当你再次需要它时,只需再次添加它。

【讨论】:

它在你写的代码中给出了一些语法错误.isActive=true,需要添加;那里有分号,但是当我添加它时显示另一个错误。 @alegelos

以上是关于使用 IOS 中的约束将 UIView 中的子视图居中的主要内容,如果未能解决你的问题,请参考以下文章

iOs - 将uiview插入代码中的另一个视图,保持约束

Interface Builder中的UIView`readableContentGuide`?

以编程方式将自动布局约束添加到恒定宽度和高度的子视图

UIView 自动布局约束 wrt 父级

iOS UIView 不调整子视图的大小?

iOS 自动布局 - xib 中的等高约束