- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一些标签作为按钮,每个标签都过滤我的表格 View 内容。在我的一个标签中,我需要将表格 View 稍微移到底部。因为我必须向用户显示另一个 View ,并且表格 View 必须位于下方。
我对 View 中的所有 View 都有约束,首先加载方法,我应该再次在标签监听器中约束我的 tableView。
这是我的第一个约束的代码
override func setupViews() {
super.setupViews()
view.addSubview(header)
view.addSubview(serachOptionView)
view.addSubview(tableView)
header.addSubview(mytitle)
view.addSubview(serachBarView)
serachBarView.addSubview(serachInCityLabel)
serachBarView.addSubview(serachInCountryLabel)
serachBarView.addSubview(serachInTransitLabel)
serachBarView.addSubview(advanceSearch)
serachBarView.addSubview(columnLabelLeft)
serachBarView.addSubview(columnLabelRight)
//TO - DO header
header.translatesAutoresizingMaskIntoConstraints=false
header.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive=true
header.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive=true
header.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive=true
header.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.17).isActive=true
header.backgroundColor = UIColor.init(patternImage: UIImage(named: "test.png")!)
// MARK -- serachBarView
serachBarView.translatesAutoresizingMaskIntoConstraints=false
serachBarView.trailingAnchor.constraint(equalTo: header.trailingAnchor, constant: -3).isActive=true
serachBarView.leadingAnchor.constraint(equalTo: header.leadingAnchor, constant: 3).isActive=true
serachBarView.bottomAnchor.constraint(equalTo: header.bottomAnchor, constant: -1).isActive=true
serachBarView.heightAnchor.constraint(equalTo: header.heightAnchor, multiplier: 0.27).isActive=true
// MARK -- INCity
serachInCityLabel.translatesAutoresizingMaskIntoConstraints=false
serachInCityLabel.trailingAnchor.constraint(equalTo: serachBarView.trailingAnchor, constant: -5).isActive=true
serachInCityLabel.topAnchor.constraint(equalTo: serachBarView.topAnchor, constant: 1).isActive=true
serachInCityLabel.bottomAnchor.constraint(equalTo: serachBarView.bottomAnchor, constant: -1).isActive=true
serachInCityLabel.widthAnchor.constraint(equalTo: serachBarView.widthAnchor, multiplier: 0.23).isActive=true
// MARK -- columnLabelRight
columnLabelRight.translatesAutoresizingMaskIntoConstraints=false
columnLabelRight.trailingAnchor.constraint(equalTo: serachInCityLabel.leadingAnchor, constant: 0).isActive=true
columnLabelRight.topAnchor.constraint(equalTo: serachInCityLabel.topAnchor, constant: 4).isActive=true
columnLabelRight.bottomAnchor.constraint(equalTo: serachInCityLabel.bottomAnchor, constant: -4).isActive=true
columnLabelRight.widthAnchor.constraint(equalToConstant: 1.5).isActive=true
// MARK -- INCountry
serachInCountryLabel.translatesAutoresizingMaskIntoConstraints=false
serachInCountryLabel.trailingAnchor.constraint(equalTo: columnLabelRight.leadingAnchor, constant: 0).isActive=true
serachInCountryLabel.topAnchor.constraint(equalTo: serachBarView.topAnchor, constant: 1).isActive=true
serachInCountryLabel.bottomAnchor.constraint(equalTo: serachBarView.bottomAnchor, constant: -1).isActive=true
serachInCountryLabel.widthAnchor.constraint(equalTo: serachBarView.widthAnchor, multiplier: 0.24).isActive=true
// MARK -- columnLabelRight
columnLabelLeft.translatesAutoresizingMaskIntoConstraints=false
columnLabelLeft.trailingAnchor.constraint(equalTo: serachInCountryLabel.leadingAnchor, constant: 0).isActive=true
columnLabelLeft.topAnchor.constraint(equalTo: serachInCountryLabel.topAnchor, constant: 4).isActive=true
columnLabelLeft.bottomAnchor.constraint(equalTo: serachInCountryLabel.bottomAnchor, constant: -4).isActive=true
columnLabelLeft.widthAnchor.constraint(equalToConstant: 1.5).isActive=true
// MARK -- INTranis
serachInTransitLabel.translatesAutoresizingMaskIntoConstraints=false
serachInTransitLabel.trailingAnchor.constraint(equalTo: serachInCountryLabel.leadingAnchor, constant: 0).isActive=true
serachInTransitLabel.topAnchor.constraint(equalTo: serachBarView.topAnchor, constant: 1).isActive=true
serachInTransitLabel.bottomAnchor.constraint(equalTo: serachBarView.bottomAnchor, constant: -1).isActive=true
serachInTransitLabel.widthAnchor.constraint(equalTo: serachBarView.widthAnchor, multiplier: 0.24).isActive=true
// MARK -- advance search
advanceSearch.translatesAutoresizingMaskIntoConstraints=false
advanceSearch.trailingAnchor.constraint(equalTo: serachInTransitLabel.leadingAnchor, constant: 0).isActive=true
advanceSearch.topAnchor.constraint(equalTo: serachBarView.topAnchor, constant: 1).isActive=true
advanceSearch.bottomAnchor.constraint(equalTo: serachBarView.bottomAnchor, constant: -1).isActive=true
advanceSearch.widthAnchor.constraint(equalTo: serachBarView.widthAnchor, multiplier: 0.24).isActive=true
// MARK -- tableView
tableView.translatesAutoresizingMaskIntoConstraints=false
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive=true
tableView.topAnchor.constraint(equalTo: serachBarView.bottomAnchor, constant: 0).isActive=true
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive=true
tableView.delegate=self
tableView.dataSource=self
tableView.register(specialGoodCell.self, forCellReuseIdentifier: "myCell")
}
然后移到我的 table 下面查看这里:
@objc func labelAction(){
// MARK -- tableView
tableView.translatesAutoresizingMaskIntoConstraints=false
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive=true
tableView.topAnchor.constraint(equalTo: mypopUpView.bottomAnchor, constant: 0).isActive=true
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive=true
tableView.delegate=self
tableView.dataSource=self
tableView.register(specialGoodCell.self, forCellReuseIdentifier: "myCell")
}
结果是没有移动和这个警告:
能够同时满足约束。
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x28276f750 UIView:0x13fd45270.bottom == UIView:0x13fd4b2f0.bottom - 1 (active)>",
"<NSLayoutConstraint:0x28276f610 V:[UIView:0x13fd45270]-(0)-[UITableView:0x1400a0000] (active)>",
"<NSLayoutConstraint:0x28276f2a0 V:[UIView:0x13fd4b2f0]-(40)-[UIView:0x13fd18a40] (active)>",
"<NSLayoutConstraint:0x28276f8e0 UIView:0x13fd18a40.height == 0.16*UIView:0x13fe428e0.height (active)>",
"<NSLayoutConstraint:0x28276a990 V:[UIView:0x13fd18a40]-(0)-[UITableView:0x1400a0000] (active)>",
"<NSLayoutConstraint:0x28276cb40 'UIView-Encapsulated-Layout-Height' UIView:0x13fe428e0.height == 568 (active)>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x28276f2a0 V:[UIView:0x13fd4b2f0]-(40)-[UIView:0x13fd18a40] (active)>
最佳答案
系统不喜欢将多个约束分配给具有相同优先级的 anchor ,因为它们会发生冲突并且系统会“破坏”其中一个以满足至少一个。如果没有另外定义,约束的默认优先级是 required
(1000)。您可以为 anchor 分配多个约束,并通过为它们分配不同的优先级(例如 defaultLow
和 defaultHigh
并代表您切换它们来激活所需的约束。
首先是保留对约束的引用以便更改它们。随时将您的代码更新为以下内容:
class MyViewController: UIViewController {
// ...
// Keep a reference to the constraints you want to change
// depending on user interaction or desired state
// in your view controller class
var tableViewConstraintTopAnchor1: NSLayoutConstraint!
var tableViewConstraintTopAnchor2: NSLayoutConstraint!
// ...
}
然后在您的 setupViews 函数中,分配它们:
func setupViews() {
// ...
// adding subviews and other constraints
// ...
// MARK -- tableView
tableView.translatesAutoresizingMaskIntoConstraints=false
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive=true
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive=true
// assign (desired, but conflicting) constraints with different priority
tableViewConstraintTopAnchor1 = tableView.topAnchor.constraint(equalTo: serachBarView.bottomAnchor, constant: 0)
tableViewConstraintTopAnchor1.priority = .defaultHigh
tableViewConstraintTopAnchor1.isActive = true
tableViewConstraintTopAnchor2 = tableView.topAnchor.constraint(equalTo: mypopUpView.bottomAnchor, constant: 0)
tableViewConstraintTopAnchor2.priority = .defaultLow
tableViewConstraintTopAnchor2.isActive = true
tableView.delegate = self
tableView.dataSource = self
tableView.register(specialGoodCell.self, forCellReuseIdentifier: "myCell")
}
在您的 labelAction 函数中,您只需切换约束的优先级并告诉系统更新您的 View 布局。
@objc func labelAction(){
// MARK -- tableView
// Switch the priority of the desired constraint to defaultHigh
// the other ones to defaultLow
tableViewConstraintTopAnchor1.priority = .defaultLow
tableViewConstraintTopAnchor2.priority = .defaultHigh
view.setNeedsLayout()
view.layoutIfNeeded()
}
也可以将其放入 UIView 动画 block 中并使整个动画效果:
@objc func labelAction(){
// MARK -- tableView
UIView.animate(withDuration: 0.2) {
self.tableViewConstraintTopAnchor1.priority = .defaultLow
self.tableViewConstraintTopAnchor2.priority = .defaultHigh
self.view.setNeedsLayout()
self.view.layoutIfNeeded()
}
}
在 viewDidLoad()
(或您在其中调用的函数)中为您的 tableView 分配两个约束仅在 mypopUpView
已经存在并且位于同一显示层次结构中时才有效- 目前还没有在你的代码中看到它 ;)
关于swift - 如何在不同情况下以编程方式快速限制 View 多次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54376234/
如何更改循环中变量的名称?比如 number1 、 number2 、 number3 、 number4 ? var array = [2,4,6,8] func ap ( number1: Int
我想设置 View 的背景颜色并在一定延迟后将其更改为另一种颜色。这是我的尝试方式: print("setting color 1") self.view.backgroundColor = UICo
我在使用 express-session 时遇到问题。 session 数据不会在请求之间持续存在。 正如您在下面的代码中看到的那样,/join 路由设置了一些 session 属性,但是当 /sur
我试图从叶渲染器获得一个非常简单的结果,用于快速 Steam 的 for 循环。 我正在上传叶文件 HTML,因为它不接受此处格式正确的代码 - 下面的pizza.swift代码- import
你们中有人有什么好的链接可以与我分享吗?我正在寻找一个 FAST 程序员编辑器,它可以非常快速地打开包含超过 100, 000 行代码的文件?我目前正在使用记事本自动取款机,打开一个 29000 行长
我现在正在处理眼动追踪数据,因此拥有一个巨大的数据集(想想数百万行),因此希望有一种快速的方法来完成此任务。这是它的简化版本。 数据告诉您眼睛在每个时间点正在查看的位置以及我们正在查看的每个文件。 X
我是新手,想为计时器或其他设备选择提示音。 如何打开此列表,以选择其中一种声音? Alert sound list 最佳答案 您将无法在应用中使用系统声音。 但是,您可以包括自己的声音文件,并将其显示
我编写了以下代码来构建具有顺序字符串的数组。 它的工作方式与我预期的一样,但我希望它能更快地运行。有没有更有效的方法在PowerShell中产生我想要的结果? 我是PowerShell的新手,非常感谢
我有一个包含一些非唯一行的矩阵,例如: x 尝试 y <- rle(apply(x, 1, paste, collapse = " ")) # y$lengths is the vector con
我的函数“keyboardWillShown”有问题。所以我想要的是菜单打开时,菜单正好出现在键盘上方。它可以在Iphone 8 plus,8、7、6上完美运行。但是,当我在模拟器上运行Iphone
我正在尝试通过Swift 5中的HTTP get方法从API提取数据。它在启动时成功加载了数据,但是当我刷新页面时,它说“索引超出范围”,这是因为数据是不再会在我的日志中读取,因此索引中没有任何内容。
我想做什么: 从我的数据库中获取时间戳并将其转换为用户的时区。 我的代码: let tryItNow = "\(model.timestampName)" let format = D
给定字体名称和字体大小,如何查找字符串的宽度(CGFloat)? (目标是将UIView的宽度设置为足以容纳字符串的宽度。) 我有两个字符串:一个重复“1”,重复36次,另一个重复“M”,重复36次。
我正在尝试解析此JSON ["Items": ( { AccountBalance = 0; AlphabetType = 3; Description = "\U0631\U
我在UINavigationBar内放置了一个UILabel。 我想根据navigationBar的高度增加该标签的字体大小。当navigationBar很大时,我希望字体大小更大;当滚动并缩小nav
我想将用户输入限制为仅有效数字并使用以下内容: func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, rep
目前我有一个包含超过 100.000 张图像的数据库,它们大小不一或类似,但我想为我的公司制作以下内容: 我插入/上传一张图片,系统返回最有可能相同的图片。我不知道使用什么算法,但它需要快速。我可以预
在我的 swift 项目中,我有一个按钮,我想在标签上打印按下该按钮的时间。 如何解决这个问题? 最佳答案 添加到DHEERAJ的答案中,您只需在func press(sender: UIButton
我必须发表评论,尝试在解析中导入数组。然而,有一个问题。 当我尝试从 Parse 加载数组时,我的输出是 ("Blah","Blah","Blah")这是一个元组...而不是一个数组 TT... 如何
我的应用程序有一个名为 MyDevice 的类,我用它来与硬件通信。该硬件是可选的,实例变量也是可选的: var theDevice:MyDevice = nil 然后,在应用程序中,我必须初始化设备
我是一名优秀的程序员,十分优秀!