我正在尝试在我的应用程序上编写一个简单的登录页面。我开始在我新更新的 Mac OS Catalina 上使用 SwiftUI。Apple 文档仍然缺乏很多。我需要在占据整个页面的 Scrollview 上垂直居中一个 VStack,其宽度为 400 的“限制”。
像这样的东西:
ScrollView(.vertical) {
VStack {
Text("Hello World")
}
.frame(maxWidth: 400, alignment: .center)
}
Run Code Online (Sandbox Code Playgroud)
使用 UIScrollView 很容易,只需要设置 ContentView 以填充高度和宽度,然后在内容视图中居中垂直 StackLayout 但现在使用 SwiftUI 我只是想知道..
目标是这样的(感谢作者)
如果有人想知道为什么我想要滚动视图中的所有内容,那是因为我的表单非常大,我希望用户同时使用横向和纵向视图,所以我真的需要内容可以滚动,还要记住,在 Ipad 中表单不会填满整个屏幕,这就是我希望它垂直居中的原因。
我有一个不寻常的错误.我在自定义视图组中有这个.该方法接收一个视图并将其添加到布局,但我不断收到相同的错误:
if((ViewGroup)view.getParent() != null){
((ViewGroup)view.getParent()).removeView(view);
}
addView(view); <--- Breakpoints puts the error on this line
Run Code Online (Sandbox Code Playgroud)
错误是:
java.lang.IllegalStateException:指定的子级已有父级.您必须首先在孩子的父母上调用removeView().
在这周围使用断点显示,即使在父级上调用removeView之后,"查看"也会保留对其父级的引用.
有些人建议使用runnable在将其添加到视图之前等待几秒钟.我没有尝试过这个,因为它似乎更像是一个黑客而不是一个解决方案.无论哪种方式,我希望有人可以提供帮助
谢谢!
PS:不是它应该重要,但我添加的这个视图的父级是我制作的自定义网格布局,其父级是一个viewpager.
编辑:
我做了一些断点和调试,从它的外观来看,网格有效地从子列表中删除了视图(debug),但是子视图在其mParent变量(debug)中保持对同一网格的引用.这怎么可能
编辑:
在活动中:
Button button = new Button(mContext);
button.setOnClickListener(mClickListener);
(...)
Random random = new Random();
button.setText(random.nextInt(9999) + " ");
mCurrentGridLayout.addCustomView(button);
Run Code Online (Sandbox Code Playgroud)
在CustomGridLayout viewgroup类中:
public void addCustomView(View view){
if((ViewGroup)view.getParent() != null){
((ViewGroup)view.getParent()).removeView(view);
}
addView(view);
}
Run Code Online (Sandbox Code Playgroud)