使用尺寸类别以编程方式实现两种不同的布局

2024-01-09

我有一个四个按钮的布局。在肖像中,它们应该一个在另一个之上。在横向中,它们应该分为两列,每列有两个按钮。

我在代码中实现了按钮 -​​ 非常简单的东西:

UIButton *btn1 = [[UIButton alloc] init];
[self.view addSubview: btn1]; 

UIButton *btn2 = [[UIButton alloc] init];
[self.view addSubview: btn2]; 

UIButton *btn3 = [[UIButton alloc] init];
[self.view addSubview: btn3]; 

UIButton *btn4 = [[UIButton alloc] init];
[self.view addSubview: btn4]; 

NSDictionary *views = NSDictionaryOfVariableBindings(btn1, btn2, btn3, btn4);

[btn1 setTranslatesAutoresizingMaskIntoConstraints:NO];
[btn2 setTranslatesAutoresizingMaskIntoConstraints:NO];
[btn3 setTranslatesAutoresizingMaskIntoConstraints:NO];
[btn4 setTranslatesAutoresizingMaskIntoConstraints:NO];

// portrait constraints
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(50)-[btn1]-(50)-|"
                                                                 options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(50)-[btn2]-(50)-|"
                                                                 options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(50)-[btn3]-(50)-|"
                                                                 options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(50)-[btn4]-(50)-|"
                                                                 options:0 metrics:nil views:views]];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[btn1]-[btn2]-[btn3]-[btn4]-(50)-|"
                                                                 options:0 metrics:nil views:views]];

这显然是纵向布局的设置。我本来会确定设备及其方向,以便为 iPad 和 iPhone 各自的方向制作特定的外壳。但现在我们应该使用尺寸类别。如何确定尺寸类别是否“紧凑”...从而设置适当的约束?


与此同时,我找到了一个很好的解决方案。由于这个问题得到了如此多的支持,我想我应该快速描述一下。我受到 WWDC 会议的启发而想到了这个解决方案。

我已经转向 Swift,所以请原谅,代码将是 swift - 但概念对于 Obj-C 是相同的。

首先声明三个约束数组:

 // Constraints
 private var compactConstraints: [NSLayoutConstraint] = []
 private var regularConstraints: [NSLayoutConstraint] = []
 private var sharedConstraints: [NSLayoutConstraint] = []

然后你相​​应地填充约束。您可以在您调用的单独函数中执行此操作viewDidLoad或者你这样做viewDidLoad直接地。

sharedConstraints.append(contentsOf: [
     btnStackView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
    ...
])

compactConstraints.append(contentsOf: [
     btnStackView.widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 0.7),
    ...
])

regularConstraints.append(contentsOf: [
     btnStackView.widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 0.4),
    ...
])

重要的部分是在尺寸类别之间切换并激活/停用适当的约束。

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {

    super.traitCollectionDidChange(previousTraitCollection)

    if (!sharedConstraints[0].isActive) {
       // activating shared constraints
       NSLayoutConstraint.activate(sharedConstraints)
    }


    if traitCollection.horizontalSizeClass == .compact && traitCollection.verticalSizeClass == .regular {
        if regularConstraints.count > 0 && regularConstraints[0].isActive {
            NSLayoutConstraint.deactivate(regularConstraints)
        }
        // activating compact constraints
        NSLayoutConstraint.activate(compactConstraints)
    } else {
        if compactConstraints.count > 0 && compactConstraints[0].isActive {
            NSLayoutConstraint.deactivate(compactConstraints)
        }
        // activating regular constraints
        NSLayoutConstraint.activate(regularConstraints)
    }
}

我知道这些限制不适合问题中的限制。但约束本身是无关紧要的。最主要的是如何根据尺寸类别在两组约束之间进行切换。

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用尺寸类别以编程方式实现两种不同的布局 的相关文章

  • 使用 Python-AppKit-Objective C 转换为预组合 Unicode 字符串

    苹果公司的这份文件技术问答 QA1235 http developer apple com qa qa2001 qa1235 html描述了一种将 unicode 字符串从组合版本转换为分解版本的方法 由于我对包含某些字符 例如重音符号 的
  • UITableView 无法一直滚动到底部[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我只是好奇 我做了一些UITable
  • Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“无法导入桥接标头”

    我的 Xcode 项目构建并运行良好 它有 Swift 和 Objective C 代码 它已安装 GPUImage 我向它添加了单元测试 现在它将不再编译 找不到 GPUImage h 文件 导入桥接标头失败 以下是我发现并尝试过的解决方
  • 使用 iPhone 控制蓝牙音频设备

    我正在寻找为 iPhone 编写应用程序 它将能够控制汽车中的收音机和 CD 播放器 收音机和播放器具有可用的蓝牙连接 我开始这个问题是为了获得这个地方所需的所有信息 我有几个问题 但如果您发现任何我没有要求的对我开始开发此应用程序不重要的
  • 如何在 iOS 中设置视图的最大宽度?

    我的应用程序有一个基本的登录屏幕 一个外框以及其中的一些文本字段和按钮 我将框设置为填满屏幕 然而 在某些设备上这个盒子会太大 如何设置视图的最大宽度和高度 您可以使用自动布局约束 使框适应屏幕尺寸 但不超过给定的宽度和高度 为此 请对宽度
  • 返回一个dispatch_async获取的变量[重复]

    这个问题在这里已经有答案了 基本上 一个方法需要返回一个在dispatch async中获取的NSDictionary 这是我尝试过的 NSDictionary fetchNSDictionary dispatch queue t Queu
  • 禁用 iPhone 4S / 新 iPad 键盘上的听写按钮

    我们的应用程序是一个医疗保健应用程序 我们的应用程序中有一个符合 HIPAA 标准的语音识别器 所有听写都可以通过它进行 医院不希望医生意外开始与不符合 HIPAA 标准的 Nuance Dragon 服务器进行对话 因此 我正在寻找可以抑
  • 删除具有estimatedItemSize 的项目时 UICollectionView 单元格大小会调整

    我有一个简单的项目 其中的故事板仅包含一个UICollectionViewController 使用 Xcode 7 1 1 为 iOS 9 1 构建 class ViewController UICollectionViewControl
  • 在 Swift 中使用 commitEditingStyle 动态删除 UITable 部分

    我正在处理一个无法解决的问题 我有一个来自客户数据库数组的名称表 每个客户在其他数据成员中都有一个名称属性 我可以成功删除某个部分中的行 但我不能删除该部分 当该部分中的最后一行被删除时 该部分必须消失 I got NSInternalIn
  • 如何将字符串从 Applescript 传递到 Objective C

    我正在开发一个应用程序 我需要能够传递一个字符串变量 from 苹果脚本 to 目标C 我已经弄清楚如何从 Objective C 类中的方法运行 Applescript 但我需要能够将 NSString 设置为 Applescript 中
  • 如何在 SQLite 中替换字符串?

    如何更新具有以下内容的表列 var mobile 233KKFSDK3234 Documents Page jpg 并将其替换为 Documents Page jpg 在 SQLite 中 注意 所有文字 除了 Documents 是动态的
  • malloc:***错误:已释放对象的校验和不正确 - 对象可能在释放后被修改

    我的 iOS 应用程序有一个大问题 它有时会崩溃 而没有详细的调试错误 堆栈跟踪为空 这是堆栈跟踪中仅有的两行 UIApplicationMain 中的 符号存根 UIHostedTextServiceSession DismissText
  • 如何将 UIImageView 裁剪为自定义形状

    用户是否可以在该位周围画一条虚线 圆圈 UIImageView他们希望裁剪到 然后为UIImageView调整大小到这些点 这有点像 Photoshop 中的套索 选取框效果 更新 从 iOS 8 x 开始 UIImageView 提供了m
  • UITextView:内存使用量巨大

    我在 UITextView 中遇到了内存使用过多的问题 我正在将 50Kb ascii 文本文件加载到 NSString 中 并将其分配给应用程序中空 UITextView 组件的 text 属性 这立即使我的内存占用量增加了 100Mb
  • 如何将unix时间戳转换为iphone中的nsdate [重复]

    这个问题在这里已经有答案了 可能的重复 从 Unix 时间戳创建 NSDate https stackoverflow com questions 5827240 create nsdate from unix timestamp 我有一个
  • 为具有多个目标和不同平台的项目编写 Podfile

    我正在准备一个支持 OS X 和 iOS 的 Pod 我的 pod 有一些自己的依赖项 这些依赖项在 podspec 文件中定义 因此我使用 Podfile 来管理我用来开发 pod 和运行测试的项目的依赖项 我正在使用 CocoaPods
  • 在 Xcode 6 中定位 iOS 7.1 或 7.0 时,应用程序中出现黑条

    重现步骤 使用Xcode6创建一个新项目 单视图模板 仅限iPhone Objective C 导航到项目设置并将部署目标从 8 0 更改为 7 1 在安装了 7 1 的 iPhone5 S 或 iPhone5 s 7 1 模拟器中运行应用
  • Objective C 中类别是如何实现的?

    作为一名程序员 我知道如何使用类别 但我很好奇它们是如何实现的 编译器是否将它们编译为对类替换方法 http developer apple com library mac documentation Cocoa Reference Obj
  • 如何将CIFilter应用到UIView上?

    根据Apple docs 过滤属性CALayer不支持iOS 当我使用正在申请的应用程序之一时CIFilter to UIView即 Splice Funimate 和 Artisto 的视频编辑器 Videoshow FX 这意味着我们可
  • 带有文本字段的 iPhone AlertView

    我有一个UIAlertView with a UITextField在里面 我想输入mail id并提交于UIAlertView s ok按钮 但是UITextField in the UIAlertView没有回复 请帮助我 thankz

随机推荐

  • 如何在我的 Angular2 应用程序中列出/输出 @Routes 中的所有路由

    我有一个快速的问题 我目前正在浏览https angular io docs ts latest api router Router class html https angular io docs ts latest api router
  • 如何用pl/sql循环接受用户输入?

    我希望能够根据用户输入将可变数量的行插入表中 例如 Please enter value enter done when no more values value 1 Please enter value enter done when n
  • 在 iFrame 中嵌入 Google Apps 脚本

    我正在尝试将使用 Google Apps 脚本中的 Javascript 动态构建的页面嵌入到我的 iFrame 网站中 但未显示 iFrame 的内容 Google Apps 脚本具有同源策略 可阻止其加载 我想做的是 我删除了完整链接
  • 类的对象..无法转换为字符串

    我做了我的第一堂课 但在将对象转换回字符串时遇到了麻烦 class Cryption var data var salt function construct data salt this gt data data this gt salt
  • 在 Windows 中从 cmd 运行 R

    我正在尝试安装 rtools 以便我可以安装另一个软件包 Google 的 causalimpact 并且该过程表明我的 R 路径环境存在问题 主要问题 我跑不了R从命令窗口 预期的行为是输出如下并给出 gt prompt R versio
  • 如何设置AMP图像居中对齐

    如何在 amp 页面中进行如下设置 p align center img src img LOCK1 png width 40 img src img lock2 png width 40 img src img LOCK3 png wid
  • 无法加载文件或程序集“PDFNet”或其依赖项之一。尝试加载格式不正确的程序

    我正在尝试从 VS2012 中的空白 Web 表单模板构建示例 Web 应用程序 并向其中添加 PDFNet dll 如果我在 NET 3 5 中运行该项目没有问题 如果我在 NET gt 4 中运行它 我会收到此错误 无法加载文件或程序集
  • 设置 UIImageView 的图像属性会导致严重滞后

    让我告诉你我遇到的问题以及我如何尝试解决它 我有一个 UIScrollView 它在从左到右滚动时加载子视图 每个子视图有 10 20 个图像 每个图像大约 400x200 当我从一个视图滚动到另一个视图时 我遇到了相当大的延迟 经过调查
  • 为什么在 Linux 上为 C 程序定义 glGenVertexArrays 而不是为 C++ 程序定义?

    考虑以下文件 include
  • 当`BundleTable.EnableOptimizations = true`时是否使用版本文件的.min?

    是否指定BundleTable EnableOptimizations true缩小所有CSS and JS文件在一个包中 或者是可用的min使用的文件版本 一个与另一个无关 BundleTable EnableOptimizations存
  • 内容控件未更新

    我正在尝试将 MainWindow 绑定到视图 我在代码中更改了该视图并期望它在主窗口中更新 但这并没有发生 我的 XAML 中有这段代码
  • SASS:不是选择器

    我有一个 notSASS mixin 中的 css 选择器 但它不执行任何操作 代码片段 mixin dropdown pos pos right not notip if comp tip true if pos right top dr
  • 多个线程从同一个套接字读取

    我正在开发一个显示来自服务器的数据的应用程序 服务器不是我的 不太稳定 建立太多连接会导致服务器崩溃 我的主要活动中有一个连接到服务器的套接字 但有时我想打开读取数据并显示数据的子活动 我的问题是 我无法使用相同的套接字来实现此目的 并且必
  • PHP gdLib 8 位 PNG 与 alpha

    如何将使用 gd 创建的图像保存为 png 8 它可以很好地保存为具有透明通道的 gif 但我想使用 png 8 此致 啤酒威斯勒 Using imagesavealpha 透明的背景颜色应该可以解决问题 基于 dfilkovi 的代码
  • 完成时的 SwiftUI EditButton 操作

    如何设置当用户点击时要执行的操作EditButton当它显示为 完成 时 甚至可以这样做吗 请注意 这与在用户可能执行的每个单独编辑中执行操作不同 例如onDelete or onMove 当用户完成所有更改并准备好提交它们时 如何设置要执
  • scikit-learn RidgeCV 评分选项不起作用

    我注意到cv values 来自 RidgeCV 的数据始终采用相同的度量 无论scoring选项 这是一个例子 from sklearn linear model import RidgeCV from sklearn datasets
  • Android Studio - GoogleAuthUtil 无法解析

    我正在使用 Android Studio 我需要使用 Google 帐户 但收到错误消息 Cannot resolve symbol GoogleAuthUtil 我已经导入了四个主要的导入内容 import com google andr
  • BackgroundWorker的IsBusy和“IsAlive”一样吗?

    我试图找到一种方法来验证BackgroundWorker线程是否处于活动状态 即仍在运行 该线程本质上是作为一个简单的无限循环实现的 while AllConditionsMet DoSomeMagic Thread Sleep 10000
  • 为什么 .NET 4 中的 BeforeFieldInit 行为发生变化?

    在 C 4 中 没有类型的行为beforefieldinit标志已更改 因此现在可以在首次使用类的任何静态字段之前调用类型初始值设定项 我的问题是为什么 C NET 团队改变了这种行为 主要原因是什么 您能举出任何实际例子来证明这种变化有意
  • 使用尺寸类别以编程方式实现两种不同的布局

    我有一个四个按钮的布局 在肖像中 它们应该一个在另一个之上 在横向中 它们应该分为两列 每列有两个按钮 我在代码中实现了按钮 非常简单的东西 UIButton btn1 UIButton alloc init self view addSu