我见过类似的post,但它并不接近我的案例
所以我有不同方向的不同屏幕布局。应用程序正在使用故事板。 为了更好地理解,我附上了UI草图的照片
正如您所看到的,有一个TableView和一个工具栏(一个自定义的)。工具栏包含2个标签和一个按钮。
所以肖像限制是:
景观限制完全不同:
我尝试从故事板中删除所有约束并以编程方式添加它们。但Xcode会在编译过程中自动添加它们。我试图删除根视图中的所有约束,但可能我没有正确浏览所有视图树,因为几个约束都没有被删除。
您是否知道如何以适当的方式实施?
这是我第一次使用自动布局体验,并不像我预期的那么容易。
这里我的解决方案不起作用(因为Xcode在编译期间添加了一些约束)
// Those properties store all constraints for portrait and landscape modes
@property (nonatomic, strong) NSArray *portraitConstraints;
@property (nonatomic, strong) NSArray *landscapeConstraints;
-(void)updateViewConstraints {
[super updateViewConstraints];
BOOL layoutIsPortrait = UIDeviceOrientationIsPortrait(self.interfaceOrientation);
if (layoutIsPortrait) {
for (NSLayoutConstraint *constraint in self.landscapeConstraints)
[constraint remove];
for (NSLayoutConstraint *constraint in self.portraitConstraints)
[constraint install];
} else {
for (NSLayoutConstraint *constraint in self.portraitConstraints)
[constraint remove];
for (NSLayoutConstraint *constraint in self.landscapeConstraints)
[constraint install];
}
}
- (NSArray *)portraitConstraints {
if (!_portraitConstraints) {
UIView *mainTable = self.myTableView;
UIView *toolbar = self.toolbarView;
UIView *firstLabel = self.firstLabel;
UIView *secondLabel = self.secondLabel;
UIView *bigButton = self.bigButton;
UIView *navBar = self.navigationController.navigationBar;
NSDictionary *views = NSDictionaryOfVariableBindings(mainTable,toolbar,firstLabel,secondLabel,bigButton,navBar);
NSMutableArray *constraints = [NSMutableArray array];
[constraints addObjectsFromArray:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:[toolbar(==80)]|"
options:0
metrics:nil
views:views]];
[constraints addObjectsFromArray:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:[navBar][mainTable][toolbar]|"
options:0
metrics:nil
views:views]];
// MORE AND MORE CONSTRAINTS ADDED HERE
_portraitConstraints = constraints;
}
return _portraitConstraints;
}
答案 0 :(得分:2)
您使用的方法当然是可行的,但会涉及相当多的代码来获取您正在寻找的布局。更简单的方法是删除故事板中的控制器视图(如果需要,可以将其复制并粘贴到xib文件中),而是创建视图,每个视图用于纵向和横向,一个xib文件。您可以在那里完成所有约束设置,只需在代码中的两个视图之间切换。您可以在一个xib文件中创建两个视图 - 我首先创建了一个肖像,因此它将是您从加载笔尖返回的数组中的第一个对象。
@interface ViewController ()
@property (strong,nonatomic) UIView *pView;;
@property (strong,nonatomic) UIView *lView;
@property (strong,nonatomic) UILabel *leftLabel;
@property (strong,nonatomic) UILabel *rightLabel;
@end
@implementation ViewController
- (void)loadView {
NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"PortraitAndLandscapeViews" owner:self options:nil];
self.pView = views[0];
self.lView = views[1];
self.view = self.pView;
}
-(void)viewWillLayoutSubviews {
BOOL layoutIsPortrait = UIDeviceOrientationIsPortrait(self.interfaceOrientation);
if (layoutIsPortrait) {
self.view = self.pView;
self.leftLabel = [self.view viewWithTag:11];
self.rightLabel = [self.view viewWithTag:12];
}else{
self.view = self.lView;
self.leftLabel = [self.view viewWithTag:21];
self.rightLabel = [self.view viewWithTag:22];
}
}