我知道这UIStackview
是iOS 9中的一项新功能.如果我希望我的应用程序支持iOS 8或iOS 7,这是否意味着我不应该使用堆栈视图?
我有一个复杂的视图层次结构,内置在Interface Builder中,具有嵌套的UIStackViews.每次隐藏一些内部堆栈视图时,我都会收到"不满意的约束"通知.我跟踪到了这个:
(
"<NSLayoutConstraint:0x1396632d0 'UISV-canvas-connection' UIStackView:0x1392c5020.top == UILabel:0x13960cd30'Also available on iBooks'.top>",
"<NSLayoutConstraint:0x139663470 'UISV-canvas-connection' V:[UIButton:0x139554f80]-(0)-| (Names: '|':UIStackView:0x1392c5020 )>",
"<NSLayoutConstraint:0x139552350 'UISV-hiding' V:[UIStackView:0x1392c5020(0)]>",
"<NSLayoutConstraint:0x139663890 'UISV-spacing' V:[UILabel:0x13960cd30'Also available on iBooks']-(8)-[UIButton:0x139554f80]>"
)
Run Code Online (Sandbox Code Playgroud)
具体来说,UISV-spacing
约束:当隐藏UIStackView时,它的高约束得到一个0常量,但这似乎与内部stackview的间距约束发生冲突:它需要我的Label和Button之间有8个点,这与隐藏约束是不可调和的,因此约束崩溃.
有没有解决的办法?我已经尝试递归隐藏隐藏堆栈视图的所有内部StackViews,但这导致奇怪的动画,其中内容浮出屏幕,并导致严重的FPS下降启动,同时仍然没有解决问题.
如何在UIStackView中的特定索引中添加排列的子视图?
就像是:
stackView.addArrangedSubview(nibView, atIndex: index)
Run Code Online (Sandbox Code Playgroud) 我试图UIStackViews
在我的ViewController
边界中分开5个.我给他们每个人一个IBOutlet
,然后打电话给他们viewDidLoad
使用该layer
财产但无济于事.是不可能以编程方式给出堆栈视图边框?
码:
@IBOutlet weak var stackView1: UIStackView!
@IBOutlet weak var stackView2: UIStackView!
@IBOutlet weak var stackView3: UIStackView!
@IBOutlet weak var stackView4: UIStackView!
@IBOutlet weak var stackView5: UIStackView!
override func viewDidLoad() {
super.viewDidLoad()
stackView1.layer.borderWidth = 5
stackView2.layer.borderWidth = 5
stackView3.layer.borderWidth = 5
stackView4.layer.borderWidth = 5
stackView5.layer.borderWidth = 5
}
Run Code Online (Sandbox Code Playgroud) 我有一个UIStackView
,里面UIScrollView
显示水平排列的动态添加的子视图.当前的解决方案将开始显示左侧的项目,我想开始从中心分配项目而不更改子视图的宽度和高度.我怎么做?我也对不使用的解决方案持开放态度UIStackView
.这样我就可以支持设备<iOS9.
(当前)
(预期)
在iOS 10及更低版本中,有一种方法可以在导航栏中的按钮数组中添加负间隔,如下所示:
UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
negativeSpacer.width = -8;
self.navigationItem.leftBarButtonItems = @[negativeSpacer, [self backButtonItem]];
Run Code Online (Sandbox Code Playgroud)
这不再适用于iOS 11(间隔变为正,而不是负).我已经检查了条形按钮项的视图层次结构,现在它已嵌入到_UIButtonBarStackView
.如何在iOS 11上调整条形按钮的位置?
我的应用有2个屏幕:
TableViewVC(这里没有堆栈视图)
DetailVC(此处所有嵌套堆栈视图;请参见图片链接:嵌套StackViews图片) - 注意,这些堆栈视图中有标签和图像.
当您按下tableview中的单元格时,它会将信息从TableViewVC传递到DetailVC.问题是隐藏DetailVC中的特定UIStackViews.我只想在视图加载时隐藏DetailVC中各个窗口中的2个堆栈视图.所以我在DetailVC中编写这段代码来完成这个:
override func viewDidLoad() {
super.viewDidLoad()
self.nameLabel.text = "John"
self.summaryStackView.hidden = true
self.combinedStackView.hidden = true
}
Run Code Online (Sandbox Code Playgroud)
一切看起来都很棒,但Xcode只在运行时发出许多警告.应用程序未运行时,Storyboard中没有警告.请参阅错误图片的链接:错误图片
基本上它是很多UISV隐藏,UISV间距,UISV-canvas连接错误.如果我隐藏相同的堆栈视图,这些错误就会消失,viewDidAppear
但是有一些闪存的东西应该被隐藏然后隐藏起来.用户简要地看到视图然后隐藏哪个不好.
很抱歉,由于无法实际发布图片而非链接,仍然无法发布.
对于如何解决这个问题,有任何的建议吗?这是一个我真正想要推出到应用程序商店的应用程序 - 这是我的第一个,所以任何帮助都会很棒!
编辑/更新1:
我找到了一个小代码,我把这个代码放在名为DetailVC的第二个屏幕中:
// Function I use to delay hiding of views
func delay(delay: Double, closure: ()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
// Hide the 2 stack views after 0.0001 seconds of screen loading
override func awakeFromNib() …
Run Code Online (Sandbox Code Playgroud) 我还没有在任何地方找到答案,我不确定是否可能,但我正在尝试右对齐水平UIStackView
,这样如果隐藏子视图,它们会向右侧而不是左侧移动.以编程方式(在Swift中)或使用Interface Builder
我最近又开始使用Swift进入iOS开发,现在我正在研究定制的UIControl.对于布局和灵活性,此自定义视图使用StackView构建.
...基本上只是具有与StackView相同的功能,当我将它直接拖到故事板中时我通常拥有它 - 它调整大小以适应没有问题.这与自我调整tableview单元基本相同.
我可以将我的CustomView简化为一个简单的例子:它是一个包含三个标签的StackView,Alignment
设置为Center
,Distribution
Equal Centering
.StackView将固定到左,右和顶部布局指南(或尾随,前导和顶部).我可以轻松地使用CustomView重新创建,从XIB加载转换为具有相同参数的CustomView - 我将两者作为屏幕截图附加.
import UIKit
@IBDesignable
class CustomView: UIView {
// loaded from NIB
private weak var view: UIView!
convenience init() {
self.init(frame: CGRect())
}
override init(frame: CGRect) {
super.init(frame: frame)
self.loadNib()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.loadNib()
}
override func layoutSubviews() {
super.layoutSubviews()
// we need to adjust the frame of the subview to no longer match the …
Run Code Online (Sandbox Code Playgroud) 令人惊讶的是这不是开箱即用的,因为这似乎是堆栈视图的一个重要用例.我有一个UITableViewCell
子类,它将一个UIStackView添加到contentView.我正在向堆栈视图中添加标签,tableView(_cellForRowAtIndexPath:)
并且tableview设置为使用动态行高,但它似乎不起作用,至少在Xcode 7.3中.我还认为隐藏在堆栈视图中的已安排的子视图是可动画的,但这似乎也被打破了.
有关如何使其正常工作的任何想法?
class StackCell : UITableViewCell {
enum VisualFormat: String {
case HorizontalStackViewFormat = "H:|[stackView]|"
case VerticalStackViewFormat = "V:|[stackView(>=44)]|"
}
var hasSetupConstraints = false
lazy var stackView : UIStackView! = {
let stack = UIStackView()
stack.axis = .Vertical
stack.distribution = .FillProportionally
stack.alignment = .Fill
stack.spacing = 3.0
stack.translatesAutoresizingMaskIntoConstraints = false
return stack
}()
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
contentView.addSubview(stackView)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented") …
Run Code Online (Sandbox Code Playgroud) uistackview ×10
ios ×8
autolayout ×5
swift ×4
cocoa-touch ×1
ios11 ×1
ios7 ×1
ios8 ×1
ios9 ×1
objective-c ×1
uiscrollview ×1
uitableview ×1
xcode ×1
xib ×1