我对出了什么问题并不乐观,但我的猜测是它与约束相关。
当我尝试调整 NSWindow 的大小时,我可以毫无问题地将其放大。但是,当我尝试将其缩小时,窗口根本不会改变大小。窗口中很少有元素具有固定大小的约束。总固定宽度只有大约 120,而我的窗口大约有 700 宽,所以我没有遇到固定宽度问题。事实上,如果我将窗口拖动到 800 宽,那么它的最小尺寸变为 800。
我的猜测是,一旦视图的大小增加,他们就不想压缩回来。但这只是一个猜测。
知道如何解决这个问题吗?抱歉,我无法提供任何代码,但我没有涉及任何代码。这只是我的 xib 中的限制。
编辑:
我添加了一个 NSLog[self.window.contentView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationHorizontal]到- (void)windowDidResize:(NSNotification *)notification. 起初,窗口让我将其调整得越来越大,这就是输出的样子:
2015-03-20 17:41:40.097 10bii Financial Calculator[19780:561394] windowDidResize Constraints: (
"<NSAutoresizingMaskLayoutConstraint:0x600000081d10 h=-&- v=-&- H:|-(0)-[NSView:0x618000121400] (Names: '|':NSThemeFrame:0x100902d90'10bii Financial Calculator' )>",
"<NSAutoresizingMaskLayoutConstraint:0x600000081d60 h=-&- v=-&- H:[NSView:0x618000121400]-(0)-| (Names: '|':NSThemeFrame:0x100902d90'10bii Financial Calculator' )>",
"<NSLayoutConstraint:0x6180000856e0 'NSWindow-current-width' H:[NSThemeFrame:0x100902d90'10bii Financial Calculator'(872@500)] priority:500>"
)
Run Code Online (Sandbox Code Playgroud)
然后,经过几次调整大小后,窗口停止允许我将其缩小,这是约束日志的输出:
2015-03-20 17:42:03.506 10bii Financial Calculator[19780:561394] windowDidResize Constraints: (
"<NSAutoresizingMaskLayoutConstraint:0x600000081d10 h=-&- v=-&- H:|-(0)-[NSView:0x618000121400] (Names: '|':NSThemeFrame:0x100902d90'10bii Financial Calculator' )>",
"<NSLayoutConstraint:0x60800008d570 H:|-(0)-[ViewWithBackground:0x608000142c00] (Names: '|':NSView:0x618000121400 …Run Code Online (Sandbox Code Playgroud) 在我的快速代码中,我使用自动布局约束。有些是直接从情节提要添加的,有些是以编程方式添加到 UIScrollView 上的。
当应用程序以阿拉伯语版本(RTL 方向)运行时,从故事板添加的自动布局约束会自动切换到 RTL 方向,而无需我做任何努力,但以编程方式添加到 UIScrollView 上的约束不会被翻转。
这是我在 UISCrollView 上添加约束的示例:
var previousView: UIView = self.productsScrollView
for productObj in productsArray {
let productViewObj: ProductView = ProductView(frame: CGRectMake(0, 0, self.productsScrollView.frame.size.width, self.productsScrollView.frame.size.height), productObj: productObj)
productViewObj.translatesAutoresizingMaskIntoConstraints = false
self.productsScrollView.addSubview(productViewObj)
// Left Constraint
let leftConstraint = NSLayoutConstraint(item: productViewObj,
attribute: .Left,
relatedBy: .Equal,
toItem: previousView,
attribute: (previousView === self.productsScrollView) ? .Left : .Right,
multiplier: 1.0,
constant: 0.0);
self.productsScrollView .addConstraint(leftConstraint)
// Top Constraint
let topConstraint = NSLayoutConstraint(item: productViewObj,
attribute: .Top,
relatedBy: .Equal,
toItem: self.productsScrollView,
attribute: …Run Code Online (Sandbox Code Playgroud) 我收到以下错误:
添加到视图时,约束的项目必须是该视图(或视图本身)的后代。如果在组装视图层次结构之前需要解决约束,这将会崩溃。中断 -[UIView(UIConstraintBasedLayout)
基本上我想要一个 200h x 200w 的蓝色视图,位于屏幕中间。
UIViewController.swift
override func loadView() {
super.loadView()
self.view = View()
}
Run Code Online (Sandbox Code Playgroud)
同时在 View.swift 中
class View: UIView {
var blueView : UIView?
convenience init() {
// also tried UIScreen.mainScreen().bounds
self.init(frame:CGRectZero)
self.backgroundColor = UIColor.redColor()
self.setupView()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init:coder")
}
override init(frame: CGRect) {
super.init(frame: frame)
}
func setupView() {
self.blueView = UIView()
self.blueView?.backgroundColor = UIColor.blueColor()
self.blueView?.translatesAutoresizingMaskIntoConstraints = false
// self.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(self.blueView!)
let centerXConstraint = NSLayoutConstraint(
// object that …Run Code Online (Sandbox Code Playgroud) 是否可以使用布局锚来覆盖整个超级视图的屏幕?
使用 NSLayoutConstraints,我可以使用下面的代码实现这种效果
dimmingView = UIView()
dimmingView.translatesAutoresizingMaskIntoConstraints = false
dimmingView.backgroundColor = UIColor(white: 0.0, alpha: 0.5)
containerView?.addSubview(dimmingView)
NSLayoutConstraint(item: containerView!, attribute: .leadingMargin, relatedBy: .equal, toItem: dimmingView, attribute: .leadingMargin, multiplier: 1, constant: 0).isActive = true
NSLayoutConstraint(item: containerView!, attribute: .trailingMargin, relatedBy: .equal, toItem: dimmingView, attribute: .trailingMargin, multiplier: 1, constant: 0).isActive = true
NSLayoutConstraint(item: containerView!, attribute: .topMargin, relatedBy: .equal, toItem: dimmingView, attribute: .topMargin, multiplier: 1, constant: 0).isActive = true
NSLayoutConstraint(item: containerView!, attribute: .bottomMargin, relatedBy: .equal, toItem: dimmingView, attribute: .bottomMargin, multiplier: 1, constant: 0).isActive = true …Run Code Online (Sandbox Code Playgroud) 我是在没有 interface builder 的情况下创建视图的新手。我正在使用NSLayoutAnchors创建视图!
当我使用在 viewcontroller 中创建的一些视图时:
let borderView:UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
view.backgroundColor = UIColor.lightGray
view.isUserInteractionEnabled = false
view.alpha = 0.5
return view
}()
Run Code Online (Sandbox Code Playgroud)
然后我使用这个视图来边界这样的视图:
view.addSubview(borderView)
borderView.bottomAnchor.constraint(equalTo: headerView.bottomAnchor).isActive = true
borderView.leftAnchor.constraint(equalTo: headerView.leftAnchor).isActive = true
borderView.rightAnchor.constraint(equalTo: headerView.rightAnchor).isActive = true
borderView.heightAnchor.constraint(equalToConstant: 1).isActive = true
Run Code Online (Sandbox Code Playgroud)
然后在另一个视图中我尝试这个:
informationView.addSubview(borderView)
borderView.topAnchor.constraint(equalTo: informationView.topAnchor).isActive = true
borderView.leftAnchor.constraint(equalTo: informationView.leftAnchor).isActive = true
borderView.rightAnchor.constraint(equalTo: informationView.rightAnchor).isActive = true
borderView.heightAnchor.constraint(equalToConstant: 1).isActive = true
Run Code Online (Sandbox Code Playgroud)
但看起来这个视图有它以前的约束结束显示约束错误!
如何borderView在重用之前删除约束?
这是我的布局。
我还使用此视频作为如何实现 UIScrollView 的参考,因为这是我第一次。https://www.youtube.com/watch?v=VE6DQGy4iS8
我不允许使用 UIStackView 因为我们的目标是 iOS 8。
我现在遇到的两个明显问题是:
我正在处理可扩展表格单元格,我的算法如下:
class ExpandableCell: UITableViewCell {
@IBOutlet weak var expandableCellHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var expandableView: UIView!
var isExpanded:Bool = false
{
didSet
{
if !isExpanded {
self.expandableCellHeightConstraint.constant = 0.0
} else {
self.expandableCellHeightConstraint.constant = 120
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
一切都很好,但我想重新调整与内部内容相关的第二个视图的大小。
这是我的约束:
所以,我的问题是:
将非严格值写入的最佳方法是什么self.expandableCellHeightConstraint.constant?实际上,我曾想过编写类似的东西self.expandableCellHeightConstraint.constant >= 120,但据我所知这是不可能的。
假设例如我希望我的视图的上边距是
iPhone 6s 30 像素
对于另一个屏幕,我想将此常量从 30 更改为 X,其中 X 与屏幕的总高度成正比
IE
iPhone X 36.5,iPhone 6s plus 33,iPhone SE 25
等等....我知道我可以拿@IBOutlet的NSLayoutConstraint,并以编程方式更改它,但我想要的是我想设置它像纵横比,我们有像子视图的HEIGH宽度高度宽度成正比它的上海华盈它具有超强的视图的高度改变和宽度
许多关于动画 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
我在 Xcode 的故事板编辑器中做了很多自动布局,但我很少在代码中做任何事情。在一个特定的实例中,我需要创建与这些约束等效的编程:
这些约束被添加到textView超级视图是另一个名为commentBox. 到目前为止我已经尝试过这个,但是代码感觉是多余的,并导致冲突约束的自动布局错误:
//Trailing
textView.addConstraint(NSLayoutConstraint(item: textView, attribute: .trailing, relatedBy: .equal, toItem: cell.commentBox, attribute: .trailing, multiplier: 1, constant: 15))
//Leading
textView.addConstraint(NSLayoutConstraint(item: textView, attribute: .leading, relatedBy: .equal, toItem: cell.commentBox, attribute: .leading, multiplier: 1, constant: 15))
//Bottom
textView.addConstraint(NSLayoutConstraint(item: textView, attribute: .bottom, relatedBy: .equal, toItem: cell.commentBox, attribute: .bottom, multiplier: 1, constant: 10))
//Top
textView.addConstraint(NSLayoutConstraint(item: textView, attribute: .top, relatedBy: .equal, toItem: cell.commentBox, attribute: .top, multiplier: 1, constant: 10))
Run Code Online (Sandbox Code Playgroud)
知道我做错了什么吗?谢谢!
ios ×7
swift ×6
autolayout ×4
cocoa ×1
localization ×1
macos ×1
nswindow ×1
storyboard ×1
uikit ×1
uiscrollview ×1
uistoryboard ×1
xcode ×1
xib ×1