使用大小类以编程方式实现两个不同的布局

约瑟夫

我有四个按钮的布局。纵向显示时,它们应该一个显示在另一个之上。在景观中,它们应分为两列,每列具有两个按钮。

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

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了,所以请原谅代码会很快-但是,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)
    }
}

我知道约束不适合问题中的约束。但是约束本身是不相关的。最主要的是如何基于大小类在两组约束之间切换。

希望这可以帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

以编程方式创建布局-两个基本问题

来自分类Dev

使用相同的XML布局以不同方式显示两个图像

来自分类Dev

使用两个不同的装饰器实现装饰所有类方法的元类

来自分类Dev

Java使用一个接口在两个类中实现不同的方法

来自分类Dev

Java使用一个接口在两个类中实现不同的方法

来自分类Dev

类使用相同的方法但检查的异常不同实现两个接口

来自分类Dev

使用来自不同布局的两个组件

来自分类Dev

在ViewController中的两个视图上以编程方式设置自动布局约束

来自分类Dev

Android:以编程方式将两个元素放在相对布局的中心

来自分类Dev

如何通过以编程方式使用Microsoft Sync Framework同步不同sql服务器上的两个表?

来自分类Dev

如何使用大小类和自动布局将两个UI按钮在Xib中水平对齐

来自分类Dev

如何对两个不同大小的列表使用assertNotEquals

来自分类Dev

如何使用php比较两个不同大小的数组?

来自分类Dev

以编程方式实现RadioButton的不同文本大小

来自分类Dev

如何以编程方式区分两个不同的Apple Watch?

来自分类Dev

如何为同一类别但英寸略有不同的布局定义两个不同的布局?

来自分类Dev

如何为两个不同的模板使用ListView类

来自分类Dev

两个具有相同属性实现方式但原型不同的javascript对象

来自分类Dev

Flutter:如何创建两个列布局,每个布局具有不同大小的可滚动ListView

来自分类Dev

复制两个不同大小的元组

来自分类Dev

声明两个不同的结构大小

来自分类Dev

两个大小不同的DIV背景

来自分类Dev

如何创建一个类的两个对象(实例),以及如何使用其函数f()的两种不同方式?

来自分类Dev

java bean在两个不同的类中不能以相同的方式工作

来自分类Dev

Dagger2 从两个不同的类注入依赖项的最佳方式

来自分类Dev

两个呈现的类之间有什么区别?它们的工作方式不同吗?

来自分类Dev

实现从两个具有不同返回类型的接口继承的类方法

来自分类Dev

XPath用于两个不同的类?

来自分类Dev

.each() 两个不同的类

Related 相关文章

  1. 1

    以编程方式创建布局-两个基本问题

  2. 2

    使用相同的XML布局以不同方式显示两个图像

  3. 3

    使用两个不同的装饰器实现装饰所有类方法的元类

  4. 4

    Java使用一个接口在两个类中实现不同的方法

  5. 5

    Java使用一个接口在两个类中实现不同的方法

  6. 6

    类使用相同的方法但检查的异常不同实现两个接口

  7. 7

    使用来自不同布局的两个组件

  8. 8

    在ViewController中的两个视图上以编程方式设置自动布局约束

  9. 9

    Android:以编程方式将两个元素放在相对布局的中心

  10. 10

    如何通过以编程方式使用Microsoft Sync Framework同步不同sql服务器上的两个表?

  11. 11

    如何使用大小类和自动布局将两个UI按钮在Xib中水平对齐

  12. 12

    如何对两个不同大小的列表使用assertNotEquals

  13. 13

    如何使用php比较两个不同大小的数组?

  14. 14

    以编程方式实现RadioButton的不同文本大小

  15. 15

    如何以编程方式区分两个不同的Apple Watch?

  16. 16

    如何为同一类别但英寸略有不同的布局定义两个不同的布局?

  17. 17

    如何为两个不同的模板使用ListView类

  18. 18

    两个具有相同属性实现方式但原型不同的javascript对象

  19. 19

    Flutter:如何创建两个列布局,每个布局具有不同大小的可滚动ListView

  20. 20

    复制两个不同大小的元组

  21. 21

    声明两个不同的结构大小

  22. 22

    两个大小不同的DIV背景

  23. 23

    如何创建一个类的两个对象(实例),以及如何使用其函数f()的两种不同方式?

  24. 24

    java bean在两个不同的类中不能以相同的方式工作

  25. 25

    Dagger2 从两个不同的类注入依赖项的最佳方式

  26. 26

    两个呈现的类之间有什么区别?它们的工作方式不同吗?

  27. 27

    实现从两个具有不同返回类型的接口继承的类方法

  28. 28

    XPath用于两个不同的类?

  29. 29

    .each() 两个不同的类

热门标签

归档