ios - 以编程方式添加的 UIView 的自动布局

标签 ios objective-c

我有一个游戏 View Controller 。在这个 GVC 中,我生成了一个像这样的 CGRect:

-(void) generateLevel1 {

    int j = 0;

    for (int i = 0; i < [self.gameModel.cards count]; i++) {
        NSInteger value = ((CardModel *)self.gameModel.cards[i]).value;


        CGFloat x = (i % _CARDS_PER_ROW) * 120 + (i % _CARDS_PER_ROW) * 40 + 208;

        CGFloat y = j * 122 + j * 40 + 324;
        CGRect frame = CGRectMake(x, y, 125, 125);


        CardView *cv = [[CardView alloc] initWithFrame:frame andPosition:i andValue:value];

        if (!((CardModel *)self.gameModel.cards[i]).outOfPlay) {
            [self.boardView addSubview:cv];


        }
    }
}

所以我现在有一个名为 boardView 的 View ,并添加了一个名为 cv 的 subview 。

我的代码是为 iPad 编写的,现在我想制作一个通用应用程序,所以我需要为 iPhone 4、5、6、6+ 缩小我的 CGRect。

最好的方法是什么?

最佳答案

您的代码从错误的方向解决问题。

Auto Layout 可以将 View 限制在其容器中,从而适应不同的设备和尺寸类别。

您可以为卡片 View 设置自动布局约束(以编程方式或在 Storyboard 中)。这将为您调整卡片 View 的大小。现在,您的问题实际上是关于在 Auto Layout 已经(按比例)为您调整大小的 View 中布置卡片。

关键是自动布局正在为您确定 View 的框架(大小和位置)。 不要尝试自行设置或更改 View 的框架。让 Auto Layout 完成它的工作,并为您调整每个 View 的大小和位置。

在卡片 View 中,您可以将卡片添加到 UIStackView (iOS 9 中的新功能)、包含的 collectionViewController 或其他形式的网格控件。

如果您想为 iOS 9 编写应用程序,UIStackView是布局卡片的最简单方法。您不必为添加的卡片添加任何约束,因为堆栈 View 可以为您处理卡片间距。根据卡片布局的简单程度,堆栈 View 甚至可以代替卡片 View 。如果您需要网格布局,只需为每行卡片使用一个堆栈 View 。

我建议在 Storyboard 中设置这些 View 及其约束。 (您可以以编程方式完成,但听起来您想学习如何让 Xcode 和 Auto Layout 为您完成繁重的工作。)您的 GameViewController 可以将卡片添加到卡片 View (容器),这将为卡片布局你。

关于ios - 以编程方式添加的 UIView 的自动布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30810149/

相关文章:

ios - Facebook 应用程序 - 在 iPad/iPhone 中找不到的页面在桌面上工作正常

ios - 无法将推送通知从 AWS SNS 发送到我的 iPad

objective-c - 无返回类型的方法 : -()foo

ios - 核心数据 : Set Managed Object Context from AppDelegate for app with UITabBarController

iphone - iOS plot 3d图形库

ios - CGPDFDocumentCreateWithURL 在任何 PDF 文件上返回 nil

ios - 如何使用 xcode 为其他证书/商店帐户构建 ios 应用程序

ios - 以编程方式添加自定义 UIButton fatal error

objective-c - UIPickerView 在 ActionSheet 上的奇怪行为

objective-c - 如何以编程方式区分 iPad 和 iPhone?