iOS:视觉格式约束被打破

时间:2013-07-02 13:51:24

标签: ios constraints visual-format-language

我正在尝试在地图上放置一个按钮,并将其约束为距左侧10个点,距离底部10个点。但是,当我在模拟器中运行它时,它告诉我我的约束被破坏了。这是我的代码。我错过了什么?

_map = [[MKMapView alloc] init];
[self setView:_map];
CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(39.810166, -86.156708);

_loc = [[TCMLocationPoint alloc] initWithCoordinate:coord title:@"My Location" subtitle:@"My Subtitle"];
[_loc setParent:_map];
[_map addAnnotation:_loc];

MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(coord, 2000, 2000);
[_map setRegion:region animated:NO];

_directionsButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[_directionsButton addTarget:self action:@selector(getLocation:) forControlEvents:UIControlEventTouchDown];
[_directionsButton setTitle:@"Get Directions" forState:UIControlStateNormal];
[_directionsButton setFrame:CGRectMake(0.0, 0.0, 150.0, 25.0)];

[[self view] addSubview:_directionsButton];

NSDictionary *nameMap = @{@"button" : _directionsButton};
NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[button]-(>=0)-|"
                                                                                     options:0
                                                                                     metrics:nil
                                                                                       views:nameMap];
[[self view] addConstraints:horizontalConstraints];
NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=0)-[button]-10-|"
                                                                                   options:0
                                                                                   metrics:nil
                                                                                     views:nameMap];

[[self view] addConstraints:verticalConstraints];

1 个答案:

答案 0 :(得分:1)

有几点想法:

  1. 我将translatesAutoresizingMaskIntoConstraints设置为NO

  2. 您也可以简化您的VFL,并消除>=0内容。您还可以在VFL中设置宽度和高度。

  3. 您也无需设置frame。让约束设置宽度,高度。

  4. 除非您在loadView中执行此操作,否则我建议您将地图添加为子视图,而不是尝试设置self.view

  5. 因此:

    _map = [[MKMapView alloc] init];
    _map.delegate = self;   // if you've implemented any `MKMapViewDelegate` methods, you should set your delegate
    [_map setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.view addSubview:_map];
    NSDictionary *views = @{@"map" : _map};
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[map]|"
                                                                      options:0
                                                                      metrics:nil
                                                                        views:views]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[map]|"
                                                                      options:0
                                                                      metrics:nil
                                                                        views:views]];
    
    // do your stuff where you're adding your annotation here
    
    _directionsButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [_directionsButton addTarget:self action:@selector(getLocation:) forControlEvents:UIControlEventTouchDown];
    [_directionsButton setTitle:@"Get Directions" forState:UIControlStateNormal];
    [_directionsButton setTranslatesAutoresizingMaskIntoConstraints:NO];
    
    [[self view] addSubview:_directionsButton];
    
    NSDictionary *nameMap = @{@"button" : _directionsButton};
    
    NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[button(150)]"
                                                                             options:0
                                                                             metrics:nil
                                                                               views:nameMap];
    [[self view] addConstraints:horizontalConstraints];
    
    NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[button(25)]-10-|"
                                                                           options:0
                                                                           metrics:nil
                                                                             views:nameMap];
    [[self view] addConstraints:verticalConstraints];
    

    您甚至可能希望将宽度和高度约束的优先级设置为小于1000,这样如果字体指示按钮应该稍微大一点,您将让它增长,例如@"H:|-10-[button(150@500)]"@"V:[button(25@500)]-10-|"