所以我已经成功将几乎所有项目转换为Swift 3,除了一个View Controller,我手动添加约束。
我的错误
view.addSubview(textView)
textView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(textView)
let views = ["textView": textView]
var constraints = NSLayoutConstraint.constraints(withVisualFormat: "V:|-70-[textView]-8-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views)
constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|-8-[textView]-8-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views)
NSLayoutConstraint.activate(constraints)
所以我把它改成了
textView.translatesAutoresizingMaskIntoConstraints = true
view.addSubview(textView)
textView.center = CGPoint(x: view.bounds.midX, y: view.bounds.midY)
textView.autoresizingMask = [UIViewAutoresizing.flexibleLeftMargin, UIViewAutoresizing.flexibleRightMargin, UIViewAutoresizing.flexibleTopMargin, UIViewAutoresizing.flexibleBottomMargin]
我要做的就是在视图控制器中向UITextView
添加UIView
,使其占据整个高度和宽度,并在中心垂直和水平放置。我用我的更新代码明显遗漏了一些明显的东西,并且我不确定为什么我之前的代码拒绝运行,因为我在Swift 2.2中工作。
有人能回答在Swift 3中添加约束的正确方法吗?
更新:
这是我原始代码中转换为Swift 3.0的错误
2016-09-06 22:08:38.751636 APPNAME [570:65129] - [_ SwiftValue nsli_superitem]:无法识别的选择器发送到实例0x17044a0e0 2016-09-06 22:08:38.752963 APPNAME [570:65129] *终止app到期 未被捕获的异常' NSInvalidArgumentException',原因: ' - [_ SwiftValue nsli_superitem]:发送到实例的无法识别的选择器 0x17044a0e0' * 第一次抛出调用堆栈:(0x18430c1c0 0x182d4455c 0x184313278 0x184310278 0x18420a59c 0x184d42104 0x184d40948 0x184d3f79c 0x184d3f340 0x100221ec0 0x1002289ac 0x100228be8 0x18a0e5b08 0x18a19f4cc 0x18a19f3a4 0x18a19e6ec 0x18a19e138 0x18a19dcec 0x18a19dc50 0x18a0e2c78 0x1875ab40c 0x1875a00e8 0x18759ffa8 0x18751cc64 0x1875440d0 0x18a0d8348 0x1842b97dc 0x1842b740c 0x1842b789c 0x1841e6048 0x185c67198 0x18a150bd0 0x18a14b908 0x100171a04 0x1831c85b8)libc ++ abi.dylib:以未捕获终止 NSException类型的异常(lldb)
答案 0 :(得分:6)
我在以下代码的最后一行出现此错误:
scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(scrollView)
contentView = UIView()
contentView.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(contentView)
let viewDict = [
"contentView": contentView,
"scrollView": scrollView,
]
let vFormat = "V:|[contentView]|"
let constraints = NSLayoutConstraint.constraints(withVisualFormat: vFormat, options: [], metrics: nil, views: viewDict)
当我在最后一行设置调试器时,它会将viewDict
类型显示为[String: UIView?]
(请注意此处的可选项。)
当我按如下方式更改声明时不会发生错误:
let viewDict: [String: UIView] = [
答案 1 :(得分:1)
您的第一个代码示例在此行中有语法错误:
textView.addConstraints(constraints: [NSLayoutConstraint])
据推测,它试图创建一个空数组,但添加一个空数组的限制没有意义,所以只需删除该行。
请注意,您的第一个代码示例(删除了错误的行)并不符合您的要求(“占据整个高度和宽度,并在中心垂直和水平放置”)。您正在指定边距,因此文本视图不会占据整个高度和宽度,垂直边距也不对称,因此不会垂直居中。
您的第二个代码示例中的问题是您使用了错误的掩码。例如,.flexibleLeftMargin
告诉系统允许view
的左边缘与textView
的左边缘之间的距离发生变化,但这与您想要的相反。
这应该做你想要的:
textView.frame = view.bounds
textView.autoresizingMask = [ .flexibleWidth, .flexibleWidth ]
如果您需要边距,请按以下方式设置框架:
var frame = view.bounds.insetBy(dx: 8, dy: 0)
frame.origin.y += 70
frame.size.height -= 78
textView.frame = frame
请注意,view
的大小必须至少为16 x 78。
答案 2 :(得分:0)
如果你想继续使用translatesAutoresizingMaskIntoConstraints = false,而不是接受的答案,我会注意到以下几点:
1)当我使用可视化格式化方法生成NSLayoutConstraints时,我得到了你得到的错误 - 在iOS9.3 SDK中编译文件的代码在运行iOS10的设备上运行良好 - 使用iOS10 SDK构建崩溃错误
2)如果你改变它来手动创建NSLayoutConstraints,例如与此类似,然后按预期工作:
var allConstraints = [NSLayoutConstraint]()
allConstraints.append(NSLayoutConstraint(item: slideView, attribute: .left, relatedBy: .equal, toItem: slideButton, attribute: .left, multiplier: 1.0, constant: 0.0))
allConstraints.append(NSLayoutConstraint(item: slideView, attribute: .right, relatedBy: .equal, toItem: slideButton, attribute: .right, multiplier: 1.0, constant: 0.0))
allConstraints.append(NSLayoutConstraint(item: slideView, attribute: .top, relatedBy: .equal, toItem: slideButton, attribute: .top, multiplier: 1.0, constant: 0.0))
allConstraints.append(NSLayoutConstraint(item: slideView, attribute: .bottom, relatedBy: .equal, toItem: slideButton, attribute: .bottom, multiplier: 1.0, constant: 0.0))
NSLayoutConstraint.activate(allConstraints)
我不知道看起来更优雅的视觉格式会出现什么问题,但此刻它看起来很破旧(或者在iOS和9.3之间的视图布局代码顺序发生了变化)。 / p>