自動レイアウト(多分)とスクロールビューに問題があります!
私の問題
- 下にスクロールします
2.次に別のビューにプッシュします
3.次に戻ると、scrollviewがそのように見え、最高点までスクロールできません(scrollviewのバウンスで表示されます)
誰か助けてもらえますか?
自動レイアウト(多分)とスクロールビューに問題があります!
私の問題
2.次に別のビューにプッシュします
3.次に戻ると、scrollviewがそのように見え、最高点までスクロールできません(scrollviewのバウンスで表示されます)
誰か助けてもらえますか?
含まれているViewControllerの次のコードスニペットも、明示的なサイズに依存することなく、問題を解決しているようです。
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
self.mainScrollView.contentOffset = CGPointZero;
}
コンテンツオフセットを原点にリセットしますが、他の答えもリセットするようです。
あなたがまだ答えを探しているなら、私は今日、壁をヘッドバンギングしてから2日後にそれを見つけました。コードを貼り付けるだけですが、最も重要なことは、scrollViewをロードするときです。
-(void)viewWillAppear:(BOOL)animated{
[scrollView setFrame:CGRectMake(0, 0, 320, 800)];
}
-(void)viewDidAppear:(BOOL)animated
{
[scrollView setScrollEnabled:YES];
[scrollView setContentSize:CGSizeMake(320, 800)];
}
これはすべて前にロードされます-(void)viewDidLoad
高さはどちらの場合も800であることに注意してください。これは、この問題を解決するために重要です。あなたのプロジェクトで頑張ってください;)
私はアダムのソリューションを使用していましたが、animated:YESで却下したときに問題が発生し始めました。私のコードでは、コンテンツオフセットはviewWillAppearのしばらく後に設定されます(viewWillAppearが早すぎるように見えるため)。
- (void)viewDidDisappear:(BOOL)animated
{
self.scrollOffsetToPersist = self.scrollView.contentOffset;
self.scrollView.contentOffset = CGPointZero;
[super viewDidDisappear:animated];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSOperationQueue mainQueue] addOperationWithBlock:^
{
self.scrollView.contentOffset = self.scrollOffsetToPersist;
}];
}
編集:別のより良い方法は、viewDidLayoutSubviewsでリセットすることです:)
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if(!CGPointEqualToPoint(CGPointZero, self.scrollOffsetToPersist))
{
self.scrollView.contentOffset = self.scrollOffsetToPersist;
self.scrollOffsetToPersist = CGPointZero;
}
}
これは素晴らしいことではありませんが、自動レイアウトが発生した後にviewDidAppearでコンテンツサイズを設定し、scrollOffsetを設定し、viewDidDisappearでスクロールオフセットを保持してから、 viewDidAppearの永続化された状態に戻るスクロールオフセット。
このような:
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:YES];
self.scrollView.contentSize = self.scrollViewInnerView.frame.size;
self.scrollView.contentOffset = [self.scrollOffsetToPersist CGPointValue];
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:YES];
self.scrollOffsetToPersist = [NSValue valueWithCGPoint:self.scrollView.contentOffset];
self.scrollView.contentOffset = CGPointZero;
}
まったくエレガントではありませんが、うまくいくので、共有したいと思いました。
UITabBarControllerと自動レイアウトのさまざまなビューを使用します。ビューはデバイスの画面よりも長くなります。あるタブから別のタブに切り替えると、説明した問題が発生することがあります。これは、切り替え前にビューが下にスクロールされた場合にのみ発生しました。ここですべてのアドバイスを試しましたが、私の場合はうまくいきませんでした。私の解決策は、ビューを離れる前にもう一度上にスクロールすることでした。少なくともiOS6でのこのバグの回避策:
-(void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[scrollView setContentOffset:CGPointZero animated:NO];
}
AutoLayoutが適用される前にScrollViewがContentOffsetに設定されていた問題の原因。解決策は次のとおりです。
プライベートプロパティを作成する
@property (assign,nonatomic) CGPoint scrollviewContentOffsetChange;
ビューメソッドにコードを追加する
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.scrollView.contentOffset = CGPointZero;
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.scrollviewContentOffsetChange = self.scrollView.contentOffset;
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
self.scrollView.contentOffset = self.scrollviewContentOffsetChange;
}
これを試しましたか?
self.automaticallyAdjustsScrollViewInsets = NO;
私の場合、これが私の問題を解決したものでした。
私も同じ問題を抱えていました。コンテンツビューのy-centerをスーパービューのy-centerに揃える制約を設定していたことがわかりました。この制約を削除すると、問題なく機能しました。
これを試して
@property (nonatomic, assign) CGPoint scrollViewContentOffsetChange;
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.scrollView.contentOffset = CGPointZero;
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.scrollViewContentOffsetChange = _scrollView.contentOffset;
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
_scrollView.contentOffset = self.scrollViewContentOffsetChange;
}