gpt4 book ai didi

ios - 激活约束 : and deactivateConstraints: not persisting after rotation for constraints created in IB

转载 作者:IT王子 更新时间:2023-10-29 07:52:43 26 4
gpt4 key购买 nike

新的 NSLayoutConstraint 方法 activateConstraints:deactivateConstraints: 似乎无法与 IB 创建的约束一起正常工作(它们确实可以正常工作对于代码创建的约束)。我用一个按钮创建了一个简单的测试应用程序,该按钮具有两组约束。已安装的一组具有 centerX 和 centerY 约束,另一组未安装的具有顶部和左侧约束(常量 10)。按钮方法切换这些约束集。这是代码,

@interface ViewController ()
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *uninstalledConstraints;
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *installedConstraints;
@end

@implementation ViewController


- (IBAction)switchconstraints:(UIButton *)sender {
[NSLayoutConstraint deactivateConstraints:self.installedConstraints];
[NSLayoutConstraint activateConstraints:self.uninstalledConstraints];
}


-(void)viewWillLayoutSubviews {
NSLog(@"installed: %@ uninstalled: %@", ((NSLayoutConstraint *)self.installedConstraints[0]).active ? @"Active" : @"Inactive", ((NSLayoutConstraint *)self.uninstalledConstraints[0]).active ? @"Active" : @"Inactive");

}

当应用程序启动时,按钮位于其安装的约束所定义的正确居中位置。在按钮的操作方法中执行激活/停用后,按钮会正确移动到新位置,但是当我将 View 旋转到横向时,它会移回其最初定义的位置(尽管日志仍将新激活的设置显示为活跃)。当我旋转回纵向时,按钮保持在其初始位置(在屏幕中央),现在日志显示初始约束集处于事件状态,而我激活的约束集处于非事件状态。

问题是,这是一个错误,还是这些方法不应该以这种方式使用 IB 定义的约束?

最佳答案

问题是您正在做一些与 Storyboard 中“未安装”约束不一致的事情。他们在那里,但不在那里。 “未安装”约束仅适用于尺寸等级!如果您要让 Xcode 在旋转时自动为您交换约束,则可以使用它们。 Xcode 无法处理您正在做的事情。但是,如果您在代码中创建第二组约束,一切都会正常进行。

所以,这样做。删除两个“未安装”约束,并删除 uninstalledConstraints 导出。现在用这个替换你的整个 View Controller 代码:

@property (strong, nonatomic) NSMutableArray *c1;
@property (strong, nonatomic) NSMutableArray *c2;
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *installedConstraints;
@property (weak,nonatomic) IBOutlet UIButton *button;
@end

@implementation ViewController {
BOOL did;
}

- (void)viewDidLayoutSubviews {
NSLog(@"did");
if (!did) {
did = YES;
self.c1 = [self.installedConstraints mutableCopy];
self.c2 = [NSMutableArray new];
[self.c2 addObject:
[NSLayoutConstraint constraintWithItem:self.button attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTopMargin multiplier:1 constant:30]];
[self.c2 addObject:
[NSLayoutConstraint constraintWithItem:self.button attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeadingMargin multiplier:1 constant:30]];
}
}

- (IBAction)switchconstraints:(UIButton *)sender {
[NSLayoutConstraint deactivateConstraints:self.c1];
[NSLayoutConstraint activateConstraints:self.c2];
NSMutableArray* temp = self.c1;
self.c1 = self.c2;
self.c2 = temp;
}

现在反复按下按钮。如您所见,它在两个位置之间跳跃。现在旋转应用程序;按钮保持原位。

关于ios - 激活约束 : and deactivateConstraints: not persisting after rotation for constraints created in IB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27663249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com