标签: snapkit

如何通过 SnapKit 更新高度约束并更新单元格高度?

我有一个 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)

uitableview tableview ios swift snapkit

8
推荐指数
2
解决办法
8481
查看次数

更新SnapKit约束偏移量

我正在使用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)

constraints ios swift snapkit

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

在 UIScrollView 中使用 snapkit/autolayout

我有一个应用程序

  • 滚动视图
    • 内容视图
      • 图表
      • 纽扣
      • 其他的东西

我尝试如下所示对其进行约束,但我缺少一个约束,而且我找不到我需要的东西。

    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()

autolayout swift ios-autolayout snapkit swift4

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

Swift-在TableViewCell中难以处理大小不同的图像

我正在使用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)

ios swift snapkit

6
推荐指数
2
解决办法
838
查看次数

如何将视野降低到安全区域?

我正在练习使用 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,它仍然没有进入安全区域?如果您能让我知道我的错误,我将不胜感激。

swift snapkit

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

使用自动布局和 SnapKit 的相对定位

我有一个标签,无论使用什么设备,我都希望在屏幕上具有相同的相对位置。例如,标签位于距视图顶部边距 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)

ios swift ios-autolayout snapkit

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

重新计算 SnapKit 对方向变化的约束

我想在手机方向改变时重新计算高度约束。我使用的功能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)

snapkit

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

Swift:如何在使用 snapkit 时获得正确的 UICollectionView 高度?

我可能会以完全错误的方式解决这个问题,因为我尝试做的应该很简单......我有一个包含几个子视图的视图组件,其中一个是 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)

iphone ios uicollectionview swift snapkit

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

Snapkit:将多个限制为边距

我正在使用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)

那么,除了非常冗长的方法之外,还有其他方法吗?我是否在文档中缺少某些内容,或者可以通过扩展添加?

autolayout swift swift3 snapkit

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

警告:非特定平台“ *”的“可用”属性中的版本号超出预期

我有这段代码:

@available(*, deprecated:3.0, message:"Use activate().")
public func install() {
    self.activate()
}
Run Code Online (Sandbox Code Playgroud)

而且由于我已经升级到swift5xcode 10.2,所以我得到以下警告:

非特定平台“ *”的“可用”属性中的版本号超出预期

并固定为:

将':3.0'替换为''

这是什么警告?它说什么?

ios swift snapkit swift5 xcode10.2

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