- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
新的 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/
新的 NSLayoutConstraint 方法 activateConstraints: 和 deactivateConstraints: 似乎无法与 IB 创建的约束一起正常工作(它们确实可以正常
我是一名优秀的程序员,十分优秀!