Ios 从列到行的自动布局约束
简化我的示例,假设我在基本视图控制器上有三个正方形。在纵向模式下,这些正方形相互堆叠,垂直间距约为20像素。比如说: XIos 从列到行的自动布局约束,ios,swift,autolayout,Ios,Swift,Autolayout,简化我的示例,假设我在基本视图控制器上有三个正方形。在纵向模式下,这些正方形相互堆叠,垂直间距约为20像素。比如说: X X X 在横向模式下,第三个X将被切断,因此我想让它看起来像这样: XXX 换言之,让底部的一个向上,并紧挨着顶部的一个(每个像素之间有20个左右的水平间距) 使用自动布局、约束和大小类执行类似操作的方法是什么?我是否以编程方式删除并重新添加约束?从整体角度来看,我很好奇如何实现这样的目标 谢谢 您可以使用NSLayoutConstraint的优先级 具有较高约束优先级的自动
X
X
在横向模式下,第三个X将被切断,因此我想让它看起来像这样: XXX 换言之,让底部的一个向上,并紧挨着顶部的一个(每个像素之间有20个左右的水平间距) 使用自动布局、约束和大小类执行类似操作的方法是什么?我是否以编程方式删除并重新添加约束?从整体角度来看,我很好奇如何实现这样的目标
谢谢 您可以使用NSLayoutConstraint的优先级 具有较高约束优先级的自动布局集视图 用于肖像 将方形视图的前导空间和顶部空间约束的优先级设置为低值(750或低于1000)。默认优先级值为1000 在界面生成器中,可以在属性检查器中设置优先级 适用于景观 在横向模式的代码中创建约束 约束应具有比肖像更高的优先级。将约束保留在数组中,并在UIViewController的
viewWillLayoutSubviews
方法中添加或删除约束
测试代码如下
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *view1; // square 1
@property (weak, nonatomic) IBOutlet UIView *view2; // square 2
@property (weak, nonatomic) IBOutlet UIView *view3; // square 3
@end
@implementation ViewController{
NSMutableArray *_constraintsList;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_constraintsList = [NSMutableArray new];
// constraints for Landscape mode
// this constraints has 1000 priority. (default value)
// please modify offset value (20 or 40) to match your case.
NSDictionary *views = @{@"view1": self.view1, @"view2": self.view2,@"view3": self.view3};
[_constraintsList addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[view1]-20-[view2]-20-[view3]"
options:0 metrics:nil
views:views]];
[_constraintsList addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[view2]" options:0 metrics:nil views:views]];
[_constraintsList addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[view3]" options:0 metrics:nil views:views]];
}
-(void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
UIInterfaceOrientation currentOrientation = [UIApplication sharedApplication].statusBarOrientation;
if(currentOrientation == UIInterfaceOrientationPortrait){
// in portrait mode.
// new constraints is not necessary.
[self.view removeConstraints:_constraintsList];
}else if(currentOrientation == UIInterfaceOrientationLandscapeLeft){
// for landscape mode
// add new constraints. then auto layout adjust view to fit new higher constraints
[self.view addConstraints:_constraintsList];
}
}
看看我这里的答案,很有意思-所以我们的想法是设置/约束它通常应该看起来的方式,优先级较低,然后如果它处于横向模式,则基本上添加具有较高优先级的新约束,并且它应该遵守新的约束?我可能应该查一下,"V:|-40-[view2]有什么作用??我想象V代表垂直,第一个元素和第二个元素之间的间距是40像素吗?是的。你完全知道我说了什么@“v:|-40-[view2]”只是示例代码。我只想告诉你们,你们需要添加垂直约束的平方2和平方3。最好将垂直约束平方2和平方3设置为等于平方1的垂直中心。谢谢-嘿,只是出于好奇,(不是想说某人更正确,等等,只是对你的意见感兴趣)你觉得这家伙做了什么?他只使用故事板就成功了:源帖子来自:你会说这是一个不太可靠的解决方案吗?或者只是实现我所说的另一种方式?谢谢你的帮助!我忘了这个@v:|-40-[view2]。v表示垂直表示视图2的超视图。在我的测试用例中,它是uiviewcontroller的视图。我在interface Builder的viewcontroller视图中添加了方形视图。40表示view2的superview和view2之间的y偏移。@user3379785我已经检查了您链接的解决方案。我认为这是一个很好的解决方案,但要理解程序员的意图有点困难。在您的例子中,正方形之间的关系对于绘制视图非常重要。计算方块位置时,不需要知道横向模式的屏幕大小。但在故事板的情况下,你们应该知道横向模式的大小来计算它。请参考,使用优先级的解决方案对于在“自动布局”中设置视图动画也很有用。