自动布局以编程方式添加UIViews

时间:2015-06-12 18:44:58

标签: ios objective-c

我有一个GameViewController。在这个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,并添加了一个名为cv。

的子视图

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

最好的办法是什么?

3 个答案:

答案 0 :(得分:0)

您的代码正在从错误的方向接近问题。

自动布局可以将视图限制在其容器中,从而适应不同的设备和大小类。

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

关键是自动布局正在为您确定视图的框架(大小和位置)。请勿尝试设置或更改视图的框架你自己。让自动布局完成其工作,并为您调整每个视图的大小和位置。

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

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

我建议的是在故事板中设置这些视图及其约束。 (你可以通过编程方式进行,但听起来你想学习如何让Xcode和Auto Layout为你做繁重的工作。)你的GameViewController可以将卡添加到卡片视图(容器),这将卡片布局为你。

答案 1 :(得分:0)

我的建议是使用数学而不是设置数字。由于CardView是CardModel的子视图,因此您可以使用CardModel大小来计算CardView大小。例如:

width = CardModel.frame.size.width / 4 * 3; //Will get 75% of the superview

height = CardModel.frame.size.height / 5 * 2; //Will et 40% of the CardModel height size

//Will get the center point of the CardModel view
xPosition = CardModel.frame.size.width / 2;
yPosition = CardModel.frame.size.height / 2;

CGRect frame = CGRectMake(xPosition, yPosition, width, height);

现在你有一个子视图,宽度为75%,高度为40%,并以CardModel为中心。在每个决定性的(Ipad,iphone等)中,你的子视图总是有这个百分比。

请记住,您可以使用修正大小并仅计算位置。

希望它有所帮助。

答案 2 :(得分:0)

您目前还没有使用自动布局,而是明确计算和设置框架。您应该使用自动布局。具体来说,您应该创建每张卡片周围卡片的限制(它们之间的间距),网格边缘卡片的超级视图(整体网格大小),然后返回第一张卡片以指定所有卡片卡片的宽度和高度相同。通过这种方式,您无需计算任何尺寸,只需在卡片周围设置填充,自动布局就可以为您完成所有网格布局。