使用 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 中的子视图居中的主要内容,如果未能解决你的问题,请参考以下文章