2013-11-15 230 views
0

我遇到了iOS和AutoLayout的问题......它是一个测试应用程序,我已经复制了这个问题。它由一个简单的视图控制器组成,包含一个固定的UIButton;当用户点击这个按钮时,委托人必须创建一个自定义视图,应用它的定位约束;该视图然后有一种方法来构建他的内容视图,并且子视图也被放置有约束。autoLayout和约束问题

下面是代码:

//MyViewController.m 

@implementation MyViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 

    UIButton *start_but = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 100, 40)]; 
    [start_but setTitle:@"Draw" forState:UIControlStateNormal]; 
    [start_but setTitleColor:[UIColor yellowColor] forState:UIControlStateNormal]; 
    [start_but addTarget:self action:@selector(clickAction:) forControlEvents:UIControlEventTouchUpInside]; 

    [self.view addSubview:start_but]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (void)clickAction: (id)sender 
{ 

    localView = [[MyView alloc] initWithFrame:CGRectMake(0, 0, 400, 300)]; 

    UIView *superview = (UIView*)localView; 

    superview.translatesAutoresizingMaskIntoConstraints = NO; 

    [self.view addSubview:localView]; 

    NSLayoutConstraint *constr = [NSLayoutConstraint constraintWithItem:localView 
                  attribute:NSLayoutAttributeTop 
                  relatedBy:NSLayoutRelationEqual 
                  toItem:self.view 
                  attribute:NSLayoutAttributeTop 
                 multiplier:1.0 
                  constant:100.0]; 

    [self.view addConstraint:constr]; 

    constr = [NSLayoutConstraint constraintWithItem:localView 
                  attribute:NSLayoutAttributeRight 
                  relatedBy:NSLayoutRelationEqual 
                  toItem:self.view 
                  attribute:NSLayoutAttributeRight 
                 multiplier:1.0 
                  constant:-50.0]; 
    [self.view addConstraint:constr]; 



    [localView CreateGuiInterface]; 
} 

@end 


//MyView.m 


@implementation MyView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
    // Initialization code 



    } 
    return self; 
} 

-(void)CreateGuiInterface 
{ 
    UIView *superview = self; 

    self.backgroundColor = [UIColor redColor]; 

    UIButton *but1 = [[UIButton alloc] init]; 
    [but1 setTitle:@"Button" forState:UIControlStateNormal]; 
    [but1 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 
    but1.backgroundColor = [UIColor yellowColor]; 

    but1.translatesAutoresizingMaskIntoConstraints = NO; 

    [superview addSubview:but1]; 

    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:but1 
                   attribute:NSLayoutAttributeRight 
                   relatedBy:NSLayoutRelationEqual 
                   toItem:superview 
                   attribute:NSLayoutAttributeRight multiplier:1.0 
                   constant:-20.0]; 

    [superview addConstraint:constraint]; 

    constraint = [NSLayoutConstraint constraintWithItem:but1 
              attribute:NSLayoutAttributeTop 
              relatedBy:NSLayoutRelationEqual 
              toItem:superview 
              attribute:NSLayoutAttributeTop 
             multiplier:1.0 
              constant:50.0]; 

    [superview addConstraint:constraint]; 

    UILabel *label = [[UILabel alloc] init]; 

    label.text = @"Label"; 
    label.backgroundColor = [UIColor greenColor]; 
    label.textColor = [UIColor blackColor]; 
    label.translatesAutoresizingMaskIntoConstraints = NO; 

    [superview addSubview:label]; 

    constraint = [NSLayoutConstraint constraintWithItem:label 
              attribute:NSLayoutAttributeRight 
              relatedBy:NSLayoutRelationEqual 
              toItem:but1 
              attribute:NSLayoutAttributeLeft 
             multiplier:1.0 
              constant:-40.0]; 
    [superview addConstraint:constraint]; 

    constraint = [NSLayoutConstraint constraintWithItem:label 
              attribute:NSLayoutAttributeTop 
              relatedBy:NSLayoutRelationEqual 
              toItem:but1 
              attribute:NSLayoutAttributeBottom 
             multiplier:1.0 
              constant:20.0]; 

    [superview addConstraint:constraint]; 

} 

@end 

所以,问题是,当我点击的iOS似乎有问题,绘制视图背景颜色。奇怪的是,'因为如果我不使用superview.translatesAutoresizingMaskIntoConstraints = NO并将视图放在一个固定的位置(例如使用initWithFrame:CGRect(100,200,300,400))而没有使用约束,它会很好地运行:在子视图和父视图中使用约束会出现问题吗? AppleDoc表示,限制不能通过视图障碍;所以我写了我的应用程序与本地视图导向约束.... 有人可以帮助我吗?

感谢咨询

回答

1

与的autoLayout的意图是从来没有SETFRAME您的任何意见。如果你想在你的超级视图中以编程方式放置你的视图,你将为此提供约束。我所做的更改将按照预期将背景变成红色。我没有改变你的MyView实现(只需在MyView.h中添加 - (void)CreateGuiInterface; )。我所做的演示变更在MyViewController实现中。

试试下面的代码来代替你的viewController的:

@interface MyViewController() 
@property (nonatomic, strong) MyView* localView; 
@end 

@implementation MyViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    UIButton *start_but = [[UIButton alloc] init]; 
    start_but.translatesAutoresizingMaskIntoConstraints = NO; 

    [start_but setTitle:@"Draw" forState:UIControlStateNormal]; 
    [start_but setTitleColor:[UIColor yellowColor] forState:UIControlStateNormal]; 
    [start_but addTarget:self action:@selector(clickAction:) forControlEvents:UIControlEventTouchUpInside]; 

    [self.view addSubview:start_but]; 

    // The following constraints simply place the initial start button in the top left 
    NSDictionary* views = NSDictionaryOfVariableBindings(start_but); 
    NSString* format = @"H:|-[start_but]"; 
    NSArray* constraints = [NSLayoutConstraint constraintsWithVisualFormat:format 
                    options:0 
                    metrics:nil 
                    views:views]; 
    [self.view addConstraints:constraints]; 
    format = @"V:|-[start_but]"; 
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:format 
                  options:0 
                  metrics:nil 
                  views:views]; 
    [self.view addConstraints:constraints]; 
} 

- (void)clickAction: (id)sender 
{ 
    self.localView = [[MyView alloc] init]; 

    UIView *superview = (UIView*)self.localView; 

    superview.translatesAutoresizingMaskIntoConstraints = NO; 

    [self.view addSubview:self.localView]; 

    // Here I'm placing your parent view (MyView) 50 points on right of the superview with 
    // a width of 400 points 
    NSDictionary* views = NSDictionaryOfVariableBindings(superview); 
    NSString* format = @"H:[superview(==400)]-(50)-|"; 
    NSArray* constraints = [NSLayoutConstraint constraintsWithVisualFormat:format 
                    options:0 
                    metrics:nil 
                    views:views]; 
    [self.view addConstraints:constraints]; 

    // Vertically 100 points from the top of the superview with a height of 300 points 
    format = @"V:|-(100)-[superview(==300)]"; 
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:format 
                  options:0 
                  metrics:nil 
                  views:views]; 
    [self.view addConstraints:constraints]; 

    [self.localView CreateGuiInterface]; 
} 

@end 
+0

是你写的,它的工作原理,非常感谢。所以,问题在于我用initWithFrame设置帧大小......将视图的大小设置为约束解决了我的问题。再次感谢! – MisterXYX83