我有一个 TableViewCell 和两个按钮来切换不同的约束。
我想更新它的高度约束和单元格高度。
就像
当我点击buttonB时跟随pic1一样,视图会像
pic2一样改变然后我点击buttonA,视图将回到pic1
我尝试修改约束,但我无法更新高度。
对我有什么想法或答案吗?
谢谢
图片1
图片2
这是代码:
class CellContainView: UIView {
let buttonA: UIButton = { () -> UIButton in
let ui = UIButton()
ui.titleLabel?.numberOfLines = 0
ui.setTitle("Click\nA", for: .normal)
ui.backgroundColor = UIColor.blue
return ui
}()
let buttonB: UIButton = { () -> UIButton in
let ui = UIButton()
ui.titleLabel?.numberOfLines = 0
ui.setTitle("Click\nB", for: .normal)
ui.backgroundColor = UIColor.gray
return ui
}()
let buttonC: UIButton = { () -> UIButton in
let ui = UIButton() …Run Code Online (Sandbox Code Playgroud) 我正在使用SnapKit,无法找到更新约束偏移的简洁方法.这是一个简单的加载栏视图,其内部视图(expiredTime)必须根据百分比填充父项(从左到右).
我在awakeFromNib自定义UIView中创建约束
self.expiredTime.snp.makeConstraints { (make) in
make.left.equalTo(self)
make.top.equalTo(self)
make.bottom.equalTo(self)
self.constraintWidth = make.width.equalTo(self).constraint
}
setNeedsUpdateConstraints()
Run Code Online (Sandbox Code Playgroud)
然后每当更新时间,我调用setNeedsUpdateConstraints()将触发默认的updateConstraints(),它已经被apple提示重载:
不起作用:( expiredTime视图始终适合父视图)
override func updateConstraints() {
let offset = self.frame.width * CGFloat(percentage)
self.expiredTime.snp.updateConstraints { (make) in
make.width.equalTo(self).offset(offset).constraint
}
super.updateConstraints()
}
Run Code Online (Sandbox Code Playgroud)
这也行不通:
override func updateConstraints() {
let offset = self.frame.width * CGFloat(percentage)
self.constraintWidth?.update(offset: offset)
super.updateConstraints()
}
Run Code Online (Sandbox Code Playgroud)
重建所有约束工作,但我想避免它
override func updateConstraints() {
self.expiredTime.snp.remakeConstraints() { (make) in
make.left.equalTo(self)
make.top.equalTo(self)
make.bottom.equalTo(self)
self.constraintWidth = make.width.equalTo(self).multipliedBy(self.percentage).constraint
}
super.updateConstraints()
}
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序
我尝试如下所示对其进行约束,但我缺少一个约束,而且我找不到我需要的东西。
self.view.addSubview(self.scrollView)
self.scrollView.snp.makeConstraints { (make) in
make.edges.equalTo(self.view)
}
let contentView = UIView()
self.scrollView.addSubview(contentView)
contentView.snp.makeConstraints { (make) in
make.top.bottom.equalTo(self.scrollView)
make.left.right.equalTo(self.view)
}
contentView.addSubview(self.chart)
self.chart.snp.makeConstraints { (make) in
// http://snapkit.io/docs/
make.edges.equalTo(contentView).inset(UIEdgeInsets(top: 30, left: 0, bottom: 50, right: 0))
}
Run Code Online (Sandbox Code Playgroud)
在哪里 scrollView = UIScrollView()
我正在使用Kingfisher加载许多远程图像,并且很难使它们正确地加载到具有动态高度单元格的Tableview中。我的目标是使图像始终是屏幕的整个宽度和动态高度,那么如何实现呢?
之前我问了一个相关的问题,该问题导致使用堆栈视图了解基本布局:SnapKit:如何以编程方式为TableViewCell中的项目设置布局约束
因此,我构建了如下内容:
使用以下代码(为简洁起见,删除了某些部分):
// CREATE VIEWS
let containerStack = UIStackView()
let header = UIView()
let headerStack = UIStackView()
let title = UILabel()
let author = UILabel()
var previewImage = UIImageView()
...
// KINGFISHER
let url = URL(string: article.imageUrl)
previewImage.kf.indicatorType = .activity
previewImage.kf.setImage(
with: url,
options: [
.transition(.fade(0.2)),
.scaleFactor(UIScreen.main.scale),
.cacheOriginalImage
]) { result in
switch result {
case .success(_):
self.setNeedsLayout()
UIView.performWithoutAnimation {
self.tableView()?.beginUpdates()
self.tableView()?.endUpdates()
}
case .failure(let error):
print(error)
}
}
...
// LAYOUT
containerStack.axis = .vertical
headerStack.axis …Run Code Online (Sandbox Code Playgroud) 我正在练习使用 snapkit 来放置视图的 ui 。然而,我尝试了很多方法来将红色盒子移动到缺口下方的安全区域,但我找不到方法。
var redView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(redView)
redView.backgroundColor = .red
redView.snp.makeConstraints{ make in
make.top.equalTo(view.safeAreaInsets.top)
make.size.width.height.equalTo(100)
make.left.equalTo(view.snp.left)
}
Run Code Online (Sandbox Code Playgroud)
这是我的代码。为什么即使我将红色盒子塔指定为安全区域Insets.top,它仍然没有进入安全区域?如果您能让我知道我的错误,我将不胜感激。
我有一个标签,无论使用什么设备,我都希望在屏幕上具有相同的相对位置。例如,标签位于距视图顶部边距 10% 和距视图左边距 30% 的位置。
常量将始终进行定位,例如距视图边缘 150 像素,因此对于分辨率较小的设备会更大,而分辨率较大的设备只会有更小的距离......
有没有办法以编程方式实现这一点,例如在 SnapKit 的帮助下?
我的代码目前看起来像这样:
import UIKit
import SnapKit
class worldViewController: UIViewController {
lazy var correctFieldNew = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(correctFieldNew)
correctFieldNew.backgroundColor = UIColor.blueColor()
correctFieldNew.snp_makeConstraints { (make) -> Void in
make.size.equalTo(CGSizeMake(90, 30))
}
}
}
Run Code Online (Sandbox Code Playgroud)
我觉得我必须在这里使用乘数,但是当我写下类似的东西时,标签不会移动一英寸:
make.top.equalTo(self.view).multipliedBy(0.1)
Run Code Online (Sandbox Code Playgroud) 我想在手机方向改变时重新计算高度约束。我使用的功能uninstall(),并install()做到这一点。但是,它没有按预期工作。我是否错误地使用了它们?
class ActionOverlayViewController: UIViewController {
private var tableView = UITableView()
private var heightConstraint: Constraint?
override func viewDidLoad() {
super.viewDidLoad()
tableView.snp_makeConstraints { make in
self.heightConstraint = make.height.lessThanOrEqualTo(UIScreen.mainScreen().bounds.size.height).priorityHigh().constraint
make.height.equalTo(242).priorityLow()
}
}
override func updateViewConstraints() {
tableView.snp_updateConstraints { make in
self.heightConstraint.uninstall()
self.heightConstraint.install()
}
super.updateViewConstraints()
}
override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
updateViewConstraints()
}
}
Run Code Online (Sandbox Code Playgroud) 我可能会以完全错误的方式解决这个问题,因为我尝试做的应该很简单......我有一个包含几个子视图的视图组件,其中一个是 UICollectionView。我使用 SnapKit 布局子视图。UICollectionView 是一个按钮流布局,跨越 0-n 行,按钮的数量从一开始就知道。
当我通过 SnapKit 配置约束时,集合的高度为 0,因为不存在任何项目(cellForItemAt 仍未调用)。
我将如何在 SnapKit 中动态设置集合的高度?或者有没有更好的方法来获得我正在寻找的非常基本的流程布局(动态高度调整)?
(注:代码略有简化,只显示相关部分)
class CategoryList: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UICollectionViewDelegate {
var categories : [String]?
var buttons = [BorderedButton]()
private(set) lazy var collectionView: UICollectionView = {
var flowLayout = UICollectionViewFlowLayout()
let collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: flowLayout)
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "collectionCell")
collectionView.delegate = self
collectionView.dataSource = self
collectionView.backgroundColor = UIColor.cyan
return collectionView
}()
override func loadView() {
super.loadView()
self.view.addSubview(collectionView)
}
override func viewDidLoad() {
super.viewDidLoad()
setupConstraints()
}
override func …Run Code Online (Sandbox Code Playgroud) 我正在使用Snapkit来简化我的自动布局代码,但是似乎经常弹出一种情况,我想知道是否有一种方法涉及更少的代码。
因此,假设我需要将a的边缘固定UIView在其超级视图边距上,我们可以执行以下操作:
subView.snp.makeConstraints { make in
make.top.equalTo(parentView.snp.topMargin)
make.bottom.equalTo(parentView.snp.bottomMargin)
make.left.equalTo(parentView.snp.leftMargin)
make.right.equalTo(parentView.snp.rightMargin)
}
Run Code Online (Sandbox Code Playgroud)
这基本上导致子视图填充父视图,除了由父视图布局边距定义的少量填充外,我敢肯定这种变化很普遍。
对于该库,这似乎过于冗长。它有一些非常好的辅助方法,例如这些
make.edges.equalToSuperview()
make.top.left.right.equalToSuperview()
Run Code Online (Sandbox Code Playgroud)
但是,我在他们的文档中没有找到关于边距的上述两种辅助方法。
我正在寻找的(如果存在)类似于以下内容:
make.edges.equalToSuperview().withMargins()
make.top.left.right.equalToSuperview().withMargins()
make.top.left.right.equalTo(someview).withMargins()
Run Code Online (Sandbox Code Playgroud)
那么,除了非常冗长的方法之外,还有其他方法吗?我是否在文档中缺少某些内容,或者可以通过扩展添加?
我有这段代码:
@available(*, deprecated:3.0, message:"Use activate().")
public func install() {
self.activate()
}
Run Code Online (Sandbox Code Playgroud)
而且由于我已经升级到swift5和xcode 10.2,所以我得到以下警告:
非特定平台“ *”的“可用”属性中的版本号超出预期
并固定为:
将':3.0'替换为''
这是什么警告?它说什么?
snapkit ×10
swift ×9
ios ×6
autolayout ×2
constraints ×1
iphone ×1
swift3 ×1
swift4 ×1
swift5 ×1
tableview ×1
uitableview ×1
xcode10.2 ×1