2011-08-23 34 views
5

我有一個包含一個按鈕的UIScrollView。 當按下按鈕時,我想使用scrollRectToVisible滾動到視圖的底部。UIScrollView ScrollRectToVisible - 不能使用動畫=是

如:

CGRect r = CGRectMake(0, myUIScrollView.contentSize.height - 1, 1, 1); 
[myUIScrollView scrollRectToVisible:r animated:YES]; 

如果我設置的動畫爲NO,一切正常, 但如果我將它設置爲YES,我看到很奇怪的行爲:

  • 基本上,沒有任何反應。
  • 如果我反覆點擊按鈕,它可能滾動幾個像素,或者可能一直滾動。
  • 但如果我在按下按鈕之前用手指手動滾動視圖, 它可能會像預期的那樣滾動到底部,但這不是一件確定的事情。

我已經打印了_geScroll_Settings.contentSize,它和預期的一樣。

我也嘗試通過啓動計時器來延遲對scrollRectToVisible的調用,但結果幾乎相同。

scrollView是相當香草。 我在界面生成器中創建它。 我在啓動時動態地添加了scrollView的內容,並且適當地調整了它的contentSize,但所有這些似乎工作正常。

有什麼想法?

+0

還沒有想通了這一點,但我必須把它完成,所以我剛開始一個計時器,並滾動它自己,直到它在正確的位置,使用setContentOffset W /動畫:NO。作品,但:( –

回答

5

我敢打賭,scrollRectToVisible是crapping,因爲可視面積爲無效(1×1),或y偏移只是邊界之外,你有沒有試着用滾動視圖的可見區域的大小設置它代替?

CGRect rectBottom = CGRectZero; 
rectBottom.size = myUIScrollView.frame.size; 
rectBottom.origin.y = myUIScrollView.contentSize.height - rectBottom.size.height; 
rectBottom.origin.x = 0; 

[myUIScrollView scrollRectToVisible:rectBottom animated:YES]; 

對不起,我幫不了你更多,但我不是在我的Mac現在,所以我不能運行測試。上面的代碼會創建一個適合scrollView可見部分的精確大小的CGRect,並且偏移量將是其中最後一個可見部分。

+0

有趣的,我會給這個嘗試,但我很可疑我沒有使用更正常的大小矩形 - 例如scrollView的寬度和一些高度大於一但小於scrollview的高度,但它沒有什麼不同,在contentSize的中間也嘗試過矩形,而不是在最後,我會讓你知道的,在附註中,我不知道CGRectZero,謝謝! –

+0

剛剛回復你這個 - 我試過了,沒有運氣,我終於用「動畫:NO」和一個計時器結束了自己的動畫效果,不管怎麼說,謝謝 –

+0

我剛剛遇到過這個,花了大概2個小時看着一切*但是* scrollRectToVisible調用。 –

0

我遇到過類似的問題,包括「如果我設置動畫爲NO,一切都按預期工作」部分。

事實證明,在iOS 6上,UITextView自動滾動其最近的父級UIScrollView,使其成爲第一響應者時可見。在iOS 7上沒有這樣的行爲。 UIScrollView似乎在兩次調用scrollRectToVisible幾乎同時時感到困惑。

在iOS 6上,我顯式調用scrollRectToVisible將被忽略大部分時間。它只會滾動,使UITextView的第一行可見(自動滾動),而不像iOS 7那樣。

要測試它,在Xcode 5中創建一個新的單視圖應用程序,將其設置爲部署目標爲6.0,並使用下面的代碼爲ViewController.m。在iOS 6.1模擬器中運行它,滾動以隱藏UITextView並點擊屏幕上的任意位置。您可能需要重試幾次,但在大多數情況下,只會顯示第一行。如果重新啓用WORKAROUD,則將UITextView嵌入到其自己的UIScrollView中,並且對scrollRectToVisible的調用按預期工作。

#import "ViewController.h" 

//#define WORKAROUND 

@interface ViewController() 
@property (nonatomic, strong) UIScrollView *scrollView; 
@property (nonatomic, strong) UITextView *textView; 
@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTap)]]; 

    self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 240)]; 
    self.scrollView.contentSize = CGSizeMake(320, 400); 
    self.scrollView.backgroundColor = [UIColor lightGrayColor]; 
    [self.view addSubview:self.scrollView]; 

#ifdef WORKAROUND 
    UIScrollView* dummyScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(20, 280, 280, 100)]; 
    self.textView = [[UITextView alloc] initWithFrame:dummyScrollView.bounds]; 
    [dummyScrollView addSubview:self.textView]; 
    [self.scrollView addSubview:dummyScrollView]; 
#else 
    self.textView = [[UITextView alloc] initWithFrame:CGRectMake(20, 280, 280, 100)]; 
    [self.scrollView addSubview:self.textView]; 
#endif 

    self.textView.backgroundColor = [UIColor grayColor]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil]; 
} 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

- (void)viewTap 
{ 
    if (self.textView.isFirstResponder) { 
     [self.textView resignFirstResponder]; 
    } 
    else { 
     [self.textView becomeFirstResponder]; 
    } 
} 

- (void)keyboardWasShown:(NSNotification*)aNotification 
{ 
#ifdef WORKAROUND 
    [self.scrollView scrollRectToVisible:CGRectInset(self.textView.superview.frame, 0, -10) animated:YES]; 
#else 
    [self.scrollView scrollRectToVisible:CGRectInset(self.textView.frame, 0, -10) animated:YES]; 
#endif 
} 

@end 
相關問題