2017-10-05 11 views
4

UIScrollViewをコードで作成しました。これはiOS10で動作します。私は今日Xcodeを更新し、iOS11ではスクロールしなくなりました(シミュレータは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は自分のコードを壊してしまいますか?

EDIT:

[self.scrollViewMain scrollRectToVisible:playerCardView.frame animated:YES]; 

をそして、それは何もしません。また

、私はそれが表示されたら、新しいサブビューを表示するには右にスクロールしてみてください。

SOLUTION:

私は今、左と右のアンカーを有し、そのcontentSizeを計算することができ

[self.scrollViewMain addConstraint:[NSLayoutConstraint constraintWithItem:self.scrollViewMain attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:playerCardView attribute:NSLayoutAttributeLeft multiplier:1 constant:10]]; 

UIScrollView

[self.scrollViewMain addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[playerCardView(200)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(playerCardView)]]; 

を変更しました。

ビジュアルフォーマットが部分的に壊れているような厄介なバグの種類。

+0

誰もが、まだこの上でAppleとバグを提出していますか? – Tawpie

答えて

5

NSLayoutConstraint constraintsWithVisualFormatを使用せずに、すべての制約を作成してみてください:私はただの数時間後にはXCode 9

にアップグレードした後に、iOSの11に私のアプリでは正確に同じ問題を持っていた

私のコードでどのような制約が問題を引き起こしたのかを調べるために、すべての呼び出しをNSLayoutConstraint constraintsWithVisualFormat:に置き換えました。NSLayoutConstraint constraintWithItem:を使用して "コードで"制約を作成しました。それがなっていて、今では...働く

私はAppleが、いくつかの予期しない副作用を引き起こす方法で、視覚的なフォーマットアナライザを修正した推測

...

+0

これは重要なリファクタリングです...他の誰かが@Hypoと同じ成功を収めていますか?@Hypo、あなたはすべてあなたの制約やUIScrollViewのサブビューをリファクタリングしましたか? – Tawpie

+0

UIScrollViewの直下のサブビューです。 ..私の推測では、リファクタリングされることになるUIScrollViewのコンテンツの幅や高さに接続する唯一の制約です...少なくとも私の場合のように見えます... – Hypo

+0

これはそれでした。私はVFを制約に変更し、今スクロールしました。追加された解決策です。私はそれが 'UIScrollView'とだけ関係があり、サブビューはスクロールビューの側に付ける必要があるので、' contentSize'とスクロールする必要があるかどうかを確認してください。 – Padin215

6

なぜiOS11は自分のコードを壊してしまいますか?

これはAppleの仕事だからです。

+0

ハハ、それはすばやい反応でした! – Padin215

+0

:D本当の人です。新しいiOSが出るたびに何かが壊れます。これには実際的な解決策があることを願っています。一方、回答セクションを悪用して申し訳ありません。ここでも同じ問題があります。 – GeneCode

+0

同じ問題もあります。レイアウト制約を追加するときにアプリがフリーズする「コンテンツサイズ」を計算する「無限ループ」も何とかしています。 iOS 11.1ベータ版でも同じ問題が発生します。 : –

関連する問題