1

我试图在地图上放置一个按钮并将其限制为从左侧开始 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];
4

1 回答 1

1

几个想法:

  1. 我会设置translatesAutoresizingMaskIntoConstraintsNO

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

  3. 您也不需要设置frame. 让约束设置宽度、高度。

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

因此:

_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-|".

于 2013-07-02T14:07:58.923 回答