作者:烦了_12664 | 来源:互联网 | 2023-01-15 13:52
我已经创建了一个UIScrollView
代码,它可以在iOS10中运行.我今天更新了我的Xcode并且它不再在iOS11中滚动(模拟器是iOS11并且不起作用;物理iPad仍然是iOS10并且可以工作).
用户可以在需要时添加子视图.当它是第一个子视图时,我将它锚定到滚动视图的左侧,顶部和底部.然后我将子视图的右侧锚定到滚动视图的右侧,它给出了contentSize
它的大小,因此它知道它需要启用滚动
UIScrollView *scrollViewMain = [UIScrollView new];
scrollViewMain.delegate = self;
scrollViewMain.backgroundColor = [UIColor greenColor];
scrollViewMain.translatesAutoresizingMaskIntoCOnstraints= NO;
scrollViewMain.directiOnalLockEnabled= YES;
self.scrollViewMain = scrollViewMain;
... // other code
if (self.countPlayers == 1) {
[self.scrollViewMain addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[playerCardView(400)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(playerCardView)]];
[self.scrollViewMain addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[playerCardView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(playerCardView)]];
NSLayoutConstraint *cOnstraint= [NSLayoutConstraint constraintWithItem:self.scrollViewMain attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:playerCardView attribute:NSLayoutAttributeRight multiplier:1 constant:10];
self.cOnstraintScrollViewRight= constraint;
[self.scrollViewMain addConstraint:constraint];
}
else {
[self.scrollViewMain addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[previousPlayerCardView]-[playerCardView(==previousPlayerCardView)]" options:0 metrics:nil views:@{@"previousPlayerCardView": player.previousPlayer.playerViewCard, @"playerCardView": player.playerViewCard}]];
[self.scrollViewMain addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[playerCardView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(playerCardView)]];
}
if (self.constraintScrollViewRight) {
[self.scrollViewMain removeConstraint:self.constraintScrollViewRight];
}
NSLayoutConstraint *cOnstraintRight= [NSLayoutConstraint constraintWithItem:self.scrollViewMain attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:playerCardView attribute:NSLayoutAttributeRight multiplier:1 constant:10];
self.cOnstraintScrollViewRight= constraintRight;
[self.scrollViewMain addConstraint:constraintRight];
[self.scrollViewMain layoutIfNeeded];
DLog(@"self.scrollViewMain: %@", self.scrollViewMain);
DLog(@"self.scrollViewMain.contentSize: %@", NSStringFromCGSize(self.scrollViewMain.contentSize));
该contentSize
不会变大,然后滚动视图的框架:
2017-10-04 20:01:58.479446-0500 [ViewController addPlayer]_block_invoke [Line 242] self.scrollViewMain: ; layer = ; contentOffset: {0, 0}; contentSize: {826, 89}; adjustedContentInset: {0, 0, 0, 0}>
2017-10-04 20:01:58.479969-0500 [ViewController addPlayer]_block_invoke [Line 243] self.scrollViewMain.contentSize: {826, 89}
为什么iOS11会破坏我的代码?
编辑:
此外,我尝试向右滚动以显示新的子视图:
[self.scrollViewMain scrollRectToVisible:playerCardView.frame animated:YES];
它什么都不做.
解:
我变了
[self.scrollViewMain addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[playerCardView(200)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(playerCardView)]];
至
[self.scrollViewMain addConstraint:[NSLayoutConstraint constraintWithItem:self.scrollViewMain attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:playerCardView attribute:NSLayoutAttributeLeft multiplier:1 constant:10]];
在UIScrollView
现在有一个左,右锚,可以计算出它contentSize
.
现在,视觉格式部分被破坏的一种蹩脚的错误.
1> GeneCode..:
为什么iOS11会破坏我的代码?
因为这是Apple的工作.
2> 小智..:
尝试在不使用NSLayoutConstraint constraintsWithVisualFormat的情况下创建所有约束:
在升级到XCode 9之后,我在iOS 11上的应用程序中遇到了完全相同的问题.
经过几个小时试图找出导致我的代码中的问题的约束,我碰巧将所有调用替换为NSLayoutConstraint constraintsWithVisualFormat:使用NSLayoutConstraint constraintWithItem来代替构建约束"by code" ; 现在它的工作原理应该......
我猜Apple已经修改了视觉格式分析器,导致一些意想不到的副作用......