标签: nslayoutconstraint

Mac Window 不会让我调整到更小,可能是限制?

我对出了什么问题并不乐观,但我的猜测是它与约束相关。

当我尝试调整 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)

macos cocoa nswindow nslayoutconstraint

1
推荐指数
1
解决办法
1614
查看次数

如何本地化以编程方式快速添加的自动布局约束

在我的快速代码中,我使用自动布局约束。有些是直接从情节提要添加的,有些是以编程方式添加到 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)

xcode localization autolayout nslayoutconstraint swift

1
推荐指数
1
解决办法
585
查看次数

以编程方式添加时,应用程序在 NSLayoutConstraint 上崩溃

我收到以下错误:

添加到视图时,约束的项目必须是该视图(或视图本身)的后代。如果在组装视图层次结构之前需要解决约束,这将会崩溃。中断 -[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)

ios nslayoutconstraint swift

1
推荐指数
1
解决办法
2739
查看次数

编程约束 - 使用布局锚覆盖整个超级视图

是否可以使用布局锚来覆盖整个超级视图的屏幕?

使用 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)

ios nslayoutconstraint swift nslayoutanchor

1
推荐指数
1
解决办法
2476
查看次数

使用 NSLayoutAnchor 时清除约束

我是在没有 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在重用之前删除约束?

ios nslayoutconstraint swift

1
推荐指数
1
解决办法
3336
查看次数

UIScrollView 内的动态高度 UILabel

我已经尝试实现这个设计大约三天了,但我尝试的一切都失败了。 在此输入图像描述

这是我的布局。

  • 蓝色部分是一个 UIScrollView,对主视图有 0 0 0 0 约束。
  • 嵌套在 UIScrollView 中的是一个 UIView,它包含我的所有内容,并且对 UIScrollView 也有 0 0 0 0 约束。我还使 UIView 的宽度等于 UIScrollView 的宽度。
  • 然后我从上到下添加元素。图像很简单,距离内容视图的上边距 10,宽度和高度固定,并在容器中水平居中。
  • 配置文件名称标签与图像相同,但仅具有固定高度。
  • 包含 3 个标签和 2 个动态高度标签的 UIView。我为 UIView 提供了顶部、左侧和右侧约束,并保留了底部,以便动态高度标签能够在需要时推动视图的高度。UILabels 设置了 0 行。
  • 第二个 UIView,内部每个标签的 0 0 0 0 和 5 5 5 5 约束
  • UITableView 位于 UIView 中,视图具有固定高度,表格也是 0 0 0 0。
  • 按钮 5 个顶部、5 个左侧、5 个右侧。然后,我使容器 UIView (包含所有这些项目)与按钮的底部边缘对齐,如本文的最佳答案中所示:UIView 具有动态高度多个 UILabel

我还使用此视频作为如何实现 UIScrollView 的参考,因为这是我第一次。https://www.youtube.com/watch?v=VE6DQGy4iS8

我不允许使用 UIStackView 因为我们的目标是 iOS 8。

我现在遇到的两个明显问题是:

  1. 当我运行应用程序时,滚动没有任何作用。 …

uiscrollview ios uistoryboard nslayoutconstraint

1
推荐指数
1
解决办法
2792
查看次数

有没有一种方法可以通过代码创建大于或等于关系的约束

我正在处理可扩展表格单元格,我的算法如下:

  1. 我创建两个视图。
  2. 创建第二个视图的高度约束,将其作为IBOutlet拖动到我的单元格中。
  3. 选择单元格后,更改所选单元格的状态。

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,但据我所知这是不可能的。

ios autolayout nslayoutconstraint swift

1
推荐指数
1
解决办法
5378
查看次数

基于屏幕(超级视图)高度的 iOS 顶部对齐约束

假设例如我希望我的视图的上边距是

iPhone 6s 30 像素

对于另一个屏幕,我想将此常量从 30 更改为 X,其中 X 与屏幕的总高度成正比

IE

iPhone X 36.5,iPhone 6s plus 33,iPhone SE 25

等等....我知道我可以拿@IBOutletNSLayoutConstraint,并以编程方式更改它,但我想要的是我想设置它像纵横比,我们有像子视图的HEIGH宽度高度宽度成正比它的上海华盈它具有超强的视图的高度改变和宽度

在此处输入图片说明

storyboard xib uikit ios nslayoutconstraint

1
推荐指数
1
解决办法
1475
查看次数

动画子视图 AutoLayout 约束更改

许多关于动画 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

1
推荐指数
1
解决办法
1406
查看次数

对 Superview 边缘的编程自动布局约束

我在 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)

知道我做错了什么吗?谢谢!

autolayout nslayoutconstraint swift

1
推荐指数
1
解决办法
2480
查看次数