2017-10-05 154 views
4

我在代碼中創建了UIScrollView,它在iOS10中工作。我今天更新了我的Xcode,並且它不再在iOS 11中滾動(模擬器是iOS11並且不工作;物理iPad仍然是iOS10並且工作正常)。UIScrollView在iOS11中不滾動

用戶可以在需要時添加子視圖。當它的第一個子視圖,我將它錨定到滾動視圖的左側,頂部和底部。然後我子視圖右側錨滾動視圖右側這給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: <UIScrollView: 0x7fa9fd01b000; frame = (286 20; 462 1014); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x60000005ff20>; layer = <CALayer: 0x600000233580>; 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]; 

它什麼都不做。

SOLUTION:

我改變

[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

現在視覺格式部分破壞的一種糟糕的錯誤。

+0

有沒有人提起了錯誤與蘋果在這嗎? – Tawpie

回答

5

儘量不使用NSLayoutConstraint constraintsWithVisualFormat創建所有的約束條件:

我剛剛有完全相同的問題,在我的應用程序在iOS上11,升級到了XCode 9

幾個小時後之後試圖找出什麼約束導致了我的代碼中的問題,我碰巧用所有的調用NSLayoutConstraint constraintsWithVisualFormat:與建設約束「的代碼」使用NSLayoutConstraint constraintWithItem:,而不是;現在它的工作原理是它應該...

我想蘋果已經修改了視覺格式分析器中,導致一些意想不到的副作用的方式...

+0

這是一個重要的重構......任何人都有@Hypo的同樣成功?還@Hypo,你重構*所有*你的約束或只是UIScrollView的子視圖? – Tawpie

+0

只是UIScrollView的直接子視圖。 ..我的猜測是,它只是連接到UIScrollView的內容寬度和/或高度的重要性的重要性...至少,在我看來,似乎... – Hypo

+0

這樣做了。我改變了VF約束,它現在滾動。增加的解決方案。我猜它只是'UIScrollView';子視圖需要附加到滾動視圖的一側,以便它可以計算'contentSize'和知道它是否需要滾動。 – Padin215

6

爲什麼iOS11會破壞我的代碼?

因爲這是蘋果的工作。

+0

哈哈,那是一個快速的迴應! – Padin215

+0

:D這是真的。每當有新的iOS出現時,就會出現問題。希望這個有一個實際的解決方案。同時,抱歉濫用答案部分。這裏有同樣的問題。 – GeneCode

+0

同樣的問題。我也有一個「無限循環」來計算'content size',這會在添加布局約束時讓我的應用程序凍結。 iOS 11.1測試版中的問題仍然存在。 :( –