2014-01-08 37 views
0

的Xcode Interface Builder的问题
一个UIView我个人不喜欢这个界面生成器在Xcode的工作方式。在这个例子中,我试图创建一个相当复杂的视图控制器。在视图控制器的viewDidLoad上,我显示了一个自定义警报视图(如此)。它实际上不是一个警报视图,而是更多的向用户显示一些信息的视图。我有一个朦胧的背景视图和顶部的视图。如果我尝试在Interface Builder创建此它变得太复杂,你不能选择在后台的意见并将其移动等未失子视图到错误的看法等等...编程方式创建具有多个标签

方案
我我试图做的是创建一个视图,其中包含一些标签和一个按钮。视图控制器具有基于此的难度属性,它将在标签/标签数量中具有不同的文本。
I.e.易 - 3个标签
硬盘 - 4个标签

我创建dimmedView和警报(风格)查看这样的:

// Setup the dimmedView 
UIView *dimmedView = [[UIView alloc] initWithFrame:self.view.frame]; 
dimmedView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.6]; 

// Setup the startingAlertView 
UIView *startingAlertView = [[UIView alloc] init]; 
startingAlertView.backgroundColor = [UIColor whiteColor]; 

我然后创建基于一些逻辑的三/四标签和添加基于逻辑的necassary标签也基于逻辑startingAlertView

这是显而易见的问题是,在任何时候对所述视图中的帧被设置。这意味着它返回0,0,0,0。我想要发生的是根据添加的标签获取所需高度的视图。

我正在建设IOS7并使用自动布局。我是否应该设置约束条件,然后调整视图中的相关高度和位置?

+0

@MarcoPace或,使用自动布局,旨在解决这个问题。 – jrturton

+0

@jrturton好,我没有读最后一句话。由于它不使用IB,我错误地认为他不想使用它们。感谢您的回复。 –

+0

谢谢,在这个例子中,IB没有用......主要是因为这是顶层视图,下面有一个复杂的视图。如果你可以切换视图以在IB内显示/隐藏,而你在其他人身上工作......现在这将是有用的 – StuartM

回答

2

我建立了IOS7并使用自动布局。我是否应该设置约束条件,然后调整视图中的相关高度和位置?

是。您不要在自动布局下使用initWithFrame:,或者更确切地说,您可以,但框架被忽略。使用CGRectZero的框架创建您的调光视图,将translatesAutoresizingMasksToConstraints设置为NO,将其添加到您的主视图并创建约束,将其锁定到超视图的所有边缘。

然后,添加您的警报视图,再次为零的框架和translates...属性设置为NO。在调光视图中创建约束以将此视图居中。该视图将从其子视图中获取其大小,因为标签具有固有大小。

将您的标签添加为此视图的子视图,零框架和translates...设置为NO。根据其内容,您可能希望设置首选的最大布局宽度或宽度限制。

创建约束将标签固定到超视图的左右边缘,并将标签以垂直“堆叠”排列起来。在每种情况下,您都可以添加填充以使警报带点边框。

这看起来像一个大量的代码,所以你可能想读我写的visual format for auto layoutcreating constraints in code的文章,与相关autolayout convenience category,使您的生活更轻松。

+1

首先感谢您的答案。其次博客文章真棒,真的帮我自己找到答案。你是对的,它需要一些代码和玩耍,但这大大有助于我对编码约束的理解,所以谢谢! – StuartM

+0

不客气! – jrturton

+0

嗨,我实际上总是使用CGRectZero,直到我使用这个开源项目https://github.com/BaiduLBS/BaiduMapKit,这是中国最受欢迎的地图工具包。当在代码中实例化其地图视图(UIView的子类)并将CGRectZero传递给init(框架:)时,它总是首次显示错误!在第一次它可以正确显示后,任何大于零的尺寸都不会有这个问题。我从来不知道为什么。你有什么主意吗 ? – Qiulang

0

如果你要自动布局路线,那么你可以添加约束,将让每个标签之间的适当空间,并与第一和最后一个标签视图的顶部和底部之间的适当空间。但是,如果您在Interface Builder中没有这样做,那么您也可以跳过使用自动布局,因为在添加标签时调整视图的高度非常简单。

您将由视线的高度设置为你希望有周围的标签的顶部和底部空间的大小开始。然后每次添加标签时,添加标签的高度加上标签之间的空间高度。

你也可以等到你添加完所有你想要的标签,然后将高度设置为底部标签的y位置加上其高度,再加上你希望有各地的标签底部空间。

0

是的,使用自动布局,您可以从父视图中获取边界。

下面是一个快速示例,请注意,我们不使用框架,并且将CGRectZero用于我们的UILabels,但定位来自updateConstraints。我正在使用Visual Format Language来布置我推荐的标签,如果您正在以编程方式进行编辑。

这里我们将标签作为父视图的宽度,然后叠放在一起。

#import "View.h" 

@implementation View{ 
    UILabel *_label1; 
    UILabel *_label2; 
    UILabel *_label3; 
} 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     _label1 = [[UILabel alloc] initWithFrame:CGRectZero]; 
     _label1.translatesAutoresizingMaskIntoConstraints = NO; 
     _label1.text = @"LABEL 1"; 

     _label2 = [[UILabel alloc] initWithFrame:CGRectZero]; 
     _label2.translatesAutoresizingMaskIntoConstraints = NO; 
     _label2.text = @"LABEL 2"; 

     _label3 = [[UILabel alloc] initWithFrame:CGRectZero]; 
     _label3.translatesAutoresizingMaskIntoConstraints = NO; 
     _label3.text = @"LABEL 3"; 

     [self addSubview:_label1]; 
     [self addSubview:_label2]; 
     [self addSubview:_label3]; 
    } 


    [self updateConstraintsIfNeeded]; 

    return self; 
} 

-(void)updateConstraints 
{ 
    [super updateConstraints]; 

    NSDictionary *_viewsDictionary = NSDictionaryOfVariableBindings(_label1,_label2,_label3); 


    // Set the contraintsto span the entire width of the super view 
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label1]-|" 
                    options:0 
                    metrics:nil 
                    views:_viewsDictionary]; 

    [self addConstraints:constraints]; 

    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label2]-|" 
                    options:0 
                    metrics:nil 
                    views:_viewsDictionary]; 
    [self addConstraints:constraints]; 

    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label3]-|" 
                    options:0 
                    metrics:nil 
                    views:_viewsDictionary]; 

    [self addConstraints:constraints]; 


    // Last setup the vertical contraints other wise they will end up in a random place 
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_label1]-[_label2]-[_label3]" 
                    options:0 
                    metrics:nil 
                    views:_viewsDictionary]; 
    [self addConstraints:constraints]; 
} 

/* 
// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
} 
*/ 

@end