Aha*_*lya 10 user-interface ios uistackview
我是新手.我已经为stackview添加了视图addArrangedSubview().但是我无法使用删除此视图removeArrangedSubview().即使在删除已安排的子视图后,视图仍然存在
import Foundation
import UIKit
class render: UIViewController {
let subview = UIStackView()
let mainview = UIStackView()
override func viewDidLoad() {
super.viewDidLoad()
self.mainviewlet()
self.login()
}
func login() {
let username = UITextField()
// text field
let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 40))
//button
// Adding to subview
subview.axis = UILayoutConstraintAxis.vertical
subview.distribution = UIStackViewDistribution.equalSpacing
subview.alignment = UIStackViewAlignment.center
subview.spacing = 16.0
subview.addArrangedSubview(username)
subview.addArrangedSubview(button)
subview.translatesAutoresizingMaskIntoConstraints = false;
// Adding subview to another stackview
mainview.addArrangedSubview(subview)
self.view.addSubview(mainview)
}
Run Code Online (Sandbox Code Playgroud)
在另一个功能中,我删除了已安排的子视图
func signup(sender: UIButton!) {
// Remove subview
mainview.removeArrangedSubview(subview)
subview.removeFromSuperview()
let firstname = UITextField()
firstname.textAlignment = NSTextAlignment.center
firstname.textColor = UIColor.black
firstname.frame = CGRect()
firstname.frame.size.height = 30;
firstname.text = "firstname"
subview.addArrangedSubview(firstname)
mainview.addArrangedSubview(subview)
self.view.addSubview(mainview)
}
Run Code Online (Sandbox Code Playgroud)
我的主视图创建为:
func mainviewlet {
mainview.axis = UILayoutConstraintAxis.vertical
mainview.distribution = UIStackViewDistribution.equalSpacing
mainview.alignment = UIStackViewAlignment.center
mainview.spacing = 16.0
mainview.translatesAutoresizingMaskIntoConstraints = false;
self.view.addSubview(mainview)
}
Run Code Online (Sandbox Code Playgroud)
我希望删除username&button并将新字段添加firstname到子视图中.
我是以正确的方式做到的吗?如何删除子视图?谢谢你的帮助
Kos*_*dis 22
如果要隐藏堆栈视图中的视图,您只需将包含视图的hidden属性设置为true,堆栈视图将处理其余视图.
所以,就我从代码中理解的那样,您必须调用的内容如下:
subview.hidden = true
Run Code Online (Sandbox Code Playgroud)
Rom*_*man 14
根据我实际测试实现 () 的经验,从 stackView 中删除子视图所需要做的就是在 stackView 的每个子视图上调用removeFromSuperview() 方法:
\n\nstackView.subviews.forEach { (view) in\n view.removeFromSuperview()\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这是它在控制台中的样子:
\n\n(lldb) po stackView.arrangedSubviews\n\xe2\x96\xbf 3 elements\n - 0 : <UIStackView: 0x7f840c8297d0; frame = (0 0; 375 95); layer = <CATransformLayer: 0x600003f48c80>>\n - 1 : <UIStackView: 0x7f840c82f5e0; frame = (0 125; 375 95); layer = <CATransformLayer: 0x600003f54520>>\n \xe2\x96\xbf 2 : <UIView: 0x7f840b3c93a0; frame = (0 250; 375 47); opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x600006bdae20>; layer = <CALayer: 0x600003f4a7e0>>\n\n(lldb) po stackView.subviews\n\xe2\x96\xbf 3 elements\n - 0 : <UIStackView: 0x7f840c8297d0; frame = (0 0; 375 95); layer = <CATransformLayer: 0x600003f48c80>>\n - 1 : <UIStackView: 0x7f840c82f5e0; frame = (0 125; 375 95); layer = <CATransformLayer: 0x600003f54520>>\n \xe2\x96\xbf 2 : <UIView: 0x7f840b3c93a0; frame = (0 250; 375 47); opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x600006bdae20>; layer = <CALayer: 0x600003f4a7e0>>\nRun Code Online (Sandbox Code Playgroud)\n\n然后删除所有子视图:
\n\n(lldb) expression stackView.subviews.forEach { (view) in view.removeFromSuperview() }\nRun Code Online (Sandbox Code Playgroud)\n\n结果:
\n\n(lldb) po stackView.subviews\n0 elements\n\n(lldb) po stackView.arrangedSubviews\n0 elements\nRun Code Online (Sandbox Code Playgroud)\n\n您可以对 UIStackView 进行扩展,以节省您将来的一些输入:
\n\nextension UIStackView {\n func removeAllSubviews() {\n subviews.forEach { (view) in\n view.removeFromSuperview()\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n
Rei*_*ill 11
在Swift 4.2中
removeArrangedSubview方法从堆栈的splittedSubviews数组中删除提供的视图。该视图的位置和大小将不再由堆栈视图管理。但是,此方法不会从堆栈的subviews数组中删除提供的视图。因此,视图仍显示为视图层次结构的一部分。
为防止在调用堆栈的removeArrangedSubview:方法后视图出现在屏幕上,请通过调用视图的removeFromSuperview()方法将其从子视图数组中显式删除,或将视图的isHidden属性设置为true。
所以:
myStackView.removeArrangedSubview(myView)
myView.removeFromSuperview()
Run Code Online (Sandbox Code Playgroud)