如何使用AutoLayout制作均匀间隔的图像行?

时间:2016-06-10 00:32:28

标签: ios swift autolayout

我刚开始在Swift开始制作这款纸牌游戏,我试图找出如何在屏幕顶部水平放置一排6张卡片。

我已尝试将6个imageView放入堆栈中,但我的手动约束最终导致最后一个图像延伸到边缘:

有人可以告诉我如何设置一行imageViews,以便每个都有一个固定的宽度,它们都居中?我对AutoLayout不熟悉,所以截图会有所帮助。

2 个答案:

答案 0 :(得分:1)

我建议使用UIStackView。看看以下Ray Wenderlich教程:

https://www.raywenderlich.com/114552/uistackview-tutorial-introducing-stack-views

然而,在继续进行更复杂的视图之前,例如前面提到的堆栈视图;你应该学会使用自动布局来避免犯下任何愚蠢的错误。

以下是来自同一网站的另一个很棒的教程:

https://www.raywenderlich.com/115440/auto-layout-tutorial-in-ios-9-part-1-getting-started-2

编辑:

改进答案:

UIStackView允许您轻松地,连续地或在列中排列元素。这节省了大量时间,使得故事板看起来更清晰,因为需要更少的约束。

developer.apple.com上的UIStackView:

  

UIStackView类提供了一个简化的界面,用于在列或行中布局视图集合。通过堆栈视图,您可以利用自动布局的强大功能,创建可以动态适应设备方向,屏幕大小和可用空间任何变化的用户界面。堆栈视图管理其arrangeSubviews属性中所有视图的布局。这些视图沿着堆栈视图的轴排列,基于它们在arrangeSubviews数组中的顺序。确切的布局取决于堆栈视图的轴,分布,对齐,间距和其他属性。

UIStackViews功能并没有停留在简化的视图对齐中。实际上,您还可以更改定义堆栈视图的属性。

  

axis属性确定堆栈的方向   垂直或水平。

     

分布属性确定排列视图的布局   沿着堆栈轴。

     

alignment属性确定排列视图的布局   垂直于堆栈的轴。

     

间距属性决定了排列之间的最小间距   视图。

     

baselineRelativeArrangement属性确定是否   视图之间的垂直间距是从基线开始测量的。

     

layoutMarginsRelativeArrangement属性确定是否   堆栈视图列出了相对于其布局边距的排列视图。

尽管有上述优点,但UIStackView仍有限制。

  

UIStackView是UIView的非渲染子类;就是这样   不提供自己的任何用户界面。相反,它只是管理   其排列的视图的位置和大小。结果,一些   属性(如backgroundColor)对堆栈视图没有影响。   同样,您不能覆盖layerClass,drawRect:或   drawLayer:inContext的:

请注意,UIStackView无法滚动。如果您需要滚动,请在UIScrollView中嵌入堆栈视图。

希望这有帮助!

答案 1 :(得分:-1)

我建议使用纯编码,了解更多信息。

如果您指定所有卡片的宽度和高度相等,则可确保最后一张卡片不会拉伸。

这就是我经常构建UI的方式:

import UIKit

class ViewController: UIViewController {

    var container:UIView = UIView();
    var card1:UIView! = nil;
    var card2:UIView! = nil;
    var card3:UIView! = nil;
    var card4:UIView! = nil;
    var card5:UIView! = nil;
    var card6:UIView! = nil;

    override func viewDidLoad() {
        super.viewDidLoad()

        self.initViews();
        self.initConstraints();
    }

    func cardView() -> UIView
    {
        let card = UIView();
        card.backgroundColor = UIColor.orangeColor();
        return card;
    }

    func initViews()
    {
        self.card1 = self.cardView();
        self.card2 = self.cardView();
        self.card3 = self.cardView();
        self.card4 = self.cardView();
        self.card5 = self.cardView();
        self.card6 = self.cardView();

        self.container.addSubview(self.card1);
        self.container.addSubview(self.card2);
        self.container.addSubview(self.card3);
        self.container.addSubview(self.card4);
        self.container.addSubview(self.card5);
        self.container.addSubview(self.card6);

        self.view.addSubview(self.container);
    }

    func initConstraints()
    {
        self.container.translatesAutoresizingMaskIntoConstraints = false;
        self.card1.translatesAutoresizingMaskIntoConstraints = false;
        self.card2.translatesAutoresizingMaskIntoConstraints = false;
        self.card3.translatesAutoresizingMaskIntoConstraints = false;
        self.card4.translatesAutoresizingMaskIntoConstraints = false;
        self.card5.translatesAutoresizingMaskIntoConstraints = false;
        self.card6.translatesAutoresizingMaskIntoConstraints = false;

        var views = [String: AnyObject]();
        views["container"] = self.container;
        views["card1"] = self.card1;
        views["card2"] = self.card2;
        views["card3"] = self.card3;
        views["card4"] = self.card4;
        views["card5"] = self.card5;
        views["card6"] = self.card6;

        self.view.addConstraint(NSLayoutConstraint(item: self.container, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1.0, constant: 0.0));

        self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-50-[container]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views));

        self.container.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[card1(60)]-10-[card2(==card1)]-10-[card3(==card1)]-10-[card4(==card1)]-10-[card5(==card1)]-10-[card6(==card1)]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views));

        self.container.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[card1(100)]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views));
        self.container.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[card2(==card1)]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views));
        self.container.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[card3(==card1)]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views));
        self.container.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[card4(==card1)]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views));
        self.container.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[card5(==card1)]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views));
        self.container.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[card6(==card1)]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views));
    }
}

你最终得到这样的东西:

screenshot