我有一个UIViewController,我正在通过IB使用Autolayout来定位和调整其子视图.
出于某种原因,我没有得到正确的UIView布局,我决定在VC中记录所有子视图大小.
我记录了子视图大小:
viewDidLoad{
self.view.layoutIfNeeded()
print(uiview.size)
}
viewDidLayoutSubviews{
print(uiview.size)
}
viewWillAppear{
print(uiview.size)
}
viewDidAppear{
print(uiview.size)
}
Run Code Online (Sandbox Code Playgroud)
子视图大小是正确的:
但它变得不正确:
如何使用ViewWillAppear中正确的子视图大小?为什么在最终的viewDidLayoutSubviews调用和viewDidAppear中我的尺寸不正确?
我正在学习Auto布局如何在iOS中运行.为此我创建了一个示例单视图应用程序,它有一个视图控制器(初始视图控制器)和一个自定义视图(我们称之为示例视图).我使用自动布局约束将示例视图添加到Main.storyboard中的视图控制器.我在Sample View中添加了一个按钮和一个标签,并带有自动布局约束.我重写了SampleView.m中的layoutSubviews和updateConstraints方法.这些被覆盖的方法只会调用它们的超级实现.我为这两种方法添加了一个断点并开始调试应用程序.以下是我的观察
我发现在SampleView中的layoutSubviews方法之前调用updateConstraints.但是我读了几篇帖子/答案,其中提到在updateConstraints之前调用layoutSubviews.现在我很困惑什么是正确的机制?updateConstraint在layoutSubviews之前调用,反之亦然.自动布局系统如何工作?
当我将设备从纵向旋转到横向或从横向旋转到纵向时,我发现SampleView的updateConstraints方法不会自动调用(但是layoutSubviews方法会自动调用),而我读了一些帖子/答案,说明在旋转时, updateConstraints方法自动调用.我再次混淆哪一个是真的?
如果updateConstrains方法没有在方向更改时自动调用,那么当方向更改时,如何在视图层次结构中的所有视图上调用updateConstraint方法?将在父视图上调用setNeedsUpdateConstraint,是否会在该视图的所有子视图上调用updateConstraint?
我刚刚开始学习IOS开发,所以我的知识很少.
我正在为我的应用构建我的布局.我需要我的应用程序在所有设备上运行.我在某处读过,在创建约束时永远不要使用常量幻数,并始终使用标准值.我想为所有决议支持我的应用程序
每当我设置标准值时,它为'0',这意味着我必须使用乘数值来获得相似的间距
如果我们能够使用恒定价值并且必须避免,请告知我们.
我有一个UIScrollView,它根据某些条件在运行时调整大小.现在我正确地使用了自动布局,而不使用额外或更少的单个约束.滚动视图的第一个子视图具有滚动视图的前导,尾随,顶部,底部和相等宽度,内容视图的高度由其内部内容管理,内部内容也根据运行时条件而变化.现在根据我的约束我的内容视图不应该水平滚动,因为我使用相同的宽度滚动视图.但它正在发生.任何人都可以建议我做错了什么?这是我使用的约束的图像.
注意: - 我已经看到堆栈上的帖子,这样的问题得到了解答,但我的情况有所不同.
我有一个观点,其中有很多subview。视图的高度取决于 的高度。subViews但在某种情况下,我希望视图的高度为 0,而不管其subView高度如何。我要实现这一点。例如,有一个名为 view 的视图,它有 2subView(image and label) view1和view2. 约束是这样的。
view1.top = view.top + 1
view1.height = 30
view2.top = view1.bottom
view.bottom = view2.bottom.
Run Code Online (Sandbox Code Playgroud) 我阅读了许多关于如何删除通过情节提要添加的约束、拖动出口然后删除等的主题,但是我如何删除以编程方式添加的约束?例如
firstView.topAnchor.constraints(equalTo: secondView.bottomAnchor, constant: 15).isActive = true
Run Code Online (Sandbox Code Playgroud)
如何停用它,然后在需要时再次启用它。也许它应该是这样的?
firstView.removeConstraint(firstView.topAnchor.constraints(equalTo: secondView.bottomAnchor))
Run Code Online (Sandbox Code Playgroud) 我在屏幕宽度为 414 点的 iPhone 6 plus 上运行我的应用程序,如果我将预览设备设置为屏幕宽度为 375 点的 iPhone 7,当表格首次加载时,我会打印出尺寸viewdidload中表格的宽度为414,但表格单元格的宽度均为375,我向上和向后滚动后,宽度变为414。在多个UITableViewController中测试,都给出了相同的结果。
我的问题是:
为什么表格视图单元格的大小取决于预览设备大小?
首次加载时如何使单元格具有正确的大小?
tableView.layoutIfNeeded()、tableView.layoutSubViews() 不起作用。
我正在使用xcode 9 beta 5.我实际上添加了逆向
addConstraint(NSLayoutConstraint.constraints(withVisualFormat: "H: |-16-[v0]-16-|" , options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":thumbnailImageView]))
addConstraint(NSLayoutConstraint.constraints(withVisualFormat: "V: |-16-[v0]-16-|" , options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":thumbnailImageView]))
Run Code Online (Sandbox Code Playgroud)
我收到了错误.
addConstraint(NSLayoutConstraint.constraints(withVisualFormat: "H: |-16-[v0]-16-|" , options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":thumbnailImageView]))
addConstraint(NSLayoutConstraint.constraints(withVisualFormat: "V: |-16-[v0]-16-|" , options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":thumbnailImageView]))
Run Code Online (Sandbox Code Playgroud)
如何删除此错误?
这应该很容易做到,而且在 android(使用 LinearLayout)中也很容易,但我不知道如何在 ios 中做到这一点。
我有 UIView,我想在其中添加一些动态高度子视图。子视图从 xib 文件加载并包含 2 个具有动态高度的 UILabels。
class Subview: UIView {
@IBOutlet var contentView: UIView!
@IBOutlet weak var title: UILabel!
@IBOutlet weak var desc: UILabel!
override init(frame: CGRect) {
super.init(frame: frame)
self.commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.commonInit()
}
fileprivate func commonInit() {
Bundle.main.loadNibNamed("Subview", owner: self, options: nil)
addSubview(contentView)
self.contentView.frame = self.bounds
self.contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
}
}
Run Code Online (Sandbox Code Playgroud)
和子视图是这样添加的
var containerView: UIView
func setupView() {
let subview1 = Subview()
subview1.title = "Some …Run Code Online (Sandbox Code Playgroud) 许多关于动画 AutoLayout 约束的教程建议更新约束的常量属性,然后调用layoutIfNeeded()动画块。
我的情况有点棘手。我有一个包含 3 个子视图的视图。这个 superview 的高度不是固定的 - 它被计算为其子视图的高度总和。在某些情况下,我要求这 3 个子视图之一切换其高度(它在 0 和 30 之间变化,即我想平滑地隐藏和显示它)。代码类似于:
// In superview
subview1.isVisibleInContext = !subview1.isVisibleInContext
// In subview
class MySubview: UIView {
@IBOutlet var heightConstraint: NSLayoutConstraint!
var isVisibleInContext = false {
didSet {
updateHeight()
}
}
func toggleHeight() {
let newHeight = isVisibleInContext ? 30 : 0
layoutIfNeeded()
heightConstraint.constant = newHeight
UIView.animate(withDuration: 0.8) {
self.layoutIfNeeded()
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这并不像我期望的那样工作。我可以看到我的子视图高度的平滑变化,但是在我为我的子视图高度约束设置新值后,我的超级视图的高度会立即重新计算。
我想看到超级视图的高度随着其子视图的增长或减少而逐渐增加/减少。
请有人指出我正确的方向。任何帮助表示赞赏。
非常感谢!
uiviewanimation ios autolayout nslayoutconstraint ios-autolayout
ios-autolayout ×10
ios ×7
swift ×6
autolayout ×5
constraints ×1
ios8 ×1
iphone ×1
objective-c ×1
uiscrollview ×1
uiview ×1
xcode6 ×1
xib ×1