1

目標/状況:
現在、TableView ヘッダーに UIView があります。TableView ヘッダーの上に配置される別の UIView (2 つのボタンといくつかの TextField を含む) を追加しようとしています。ユーザーがヘッダーを超えて上にスクロールしたときにビューが表示され(「引っ張って更新」)、ユーザーがビューの「完了」ボタンを押すと消えます。

私の3つの質問:

  1. テーブルビュー ヘッダーの上にビューを追加するにはどうすればよいですか?
  2. ユーザーがヘッダーを超えて上にスクロールしたときに、このビューを表示するにはどうすればよいですか?
  3. ユーザーがビューのボタンを押したときにビューを閉じるにはどうすればよいですか?

編集:
@kimpoy の提案に従って、カスタム ビューをサード パーティの PullToRefresh TableViewController に追加します。

4

4 に答える 4

1

私がそれを正しく理解していれば、ユーザーがプルする量に応じて、ユーザーがトリガーするアルベによって2つの異なるメソッド呼び出しをトリガーするプルアクションを作成したいと考えています。

追加したいUiViewは「2番目のヘッダー」であると想定しています。「プルしてヘッダーを更新する」に似たものにする必要があります。

魔法は UIScrollView デリゲートも利用していると思います。多くの例で、"Pull to ..." は単に scrollView.contentOffset.y を確認するだけのものであることがわかります。

したがって、次のようなことができます。

// pull to refresh 関数をチェックするためのコード (簡略化)

- (void) scrollViewDidScroll:(UIScrollView *)scrollView {
      if (self.scrollView.contentOffset.y <= - 65.0f) {}
  }

- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
      if (self.scrollView.contentOffset.y <= - 65.0f) {}
  }

次のように変更します。

- (void) scrollViewDidScroll:(UIScrollView *)scrollView {
     if ( -65.0f <= self.scrollView.contentOffset.y <= - 55.0f  ) {
         // give a area for checking the origin pull to refresh action
     }

     if (self.scrollView.contentOffset.y <= - 65.0f) {
        // checking for ur function
     }
 }

 - (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
     if ( -65.0f <= self.scrollView.contentOffset.y <= - 55.0f ) {
        // give a area for checking the origin pull to refresh action
     }

     if (self.scrollView.contentOffset.y <= - 65.0f) {
        // checking for ur function

        // add ur view the UIScrollView / TableView
        // set ur scrollview offset to show ur whole form
        [scrollView setContentOffset:CGPointMake(0, y)];
     }

  }

最後に、フォームボタンにメソッド呼び出しを追加して、必要なことを行います(フォームを削除し、スクロールビューのコンテンツオフセットを(0,0)に戻します)

(申し訳ありませんが、私は概念ではなく、うまくいくかどうかわかりません)

于 2012-06-18T07:59:26.677 に答える
0

このように実装する必要があります。EGORefreshTableHeaderViewPullToRefreshなどのサード パーティを使用します。

  1. これら 2 つは、テーブルビューの上に「プルして更新」ビューを作成するのに役立ちます。
  2. .h ファイルでサードパーティ クラスのインスタンスを宣言します。
  3. これら 2 つのいずれかを、実装するクラスにインスタンス化します。次に、「プルして更新」ビュー内にカスタムの外観を持たせるには、カスタム ビューを追加するだけです。

例: // .h ファイル内のインスタンス EGoRefreshTableHeaderView *refresh;

// In your .m file

// Set up your custom view with the added buttons and textfields.
UIView *customView...

// Instantiate pull to refresh third party class and add to table
EGoRefreshTableHeaderView *tempRefresh = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.tableViewCompanyContacts.bounds.size.height, self.view.frame.size.width, self.tableViewCompanyContacts.bounds.size.height)];
[tempRefresh setDelegate:self];

// Add your custom view
[tempRefresh addSubView:customView];

// Set your instance
[self setRefresh:tempRefresh];

// Release temp instance
[tempRefresh release];

// Add your third party to the table
[self.tableView addSubView:refresh];

// Implement delegate method (to refresh)

通常、このビューは、更新が完了すると消えるか、非表示になります。ビューが非表示になっているとき (ボタンのクリックなど) をユーザーが処理できるように、コードにいくつかの調整を加えるだけです。

「プルして更新」アクションのメソッドが提供されます。何か困ったことがあれば言ってください。幸運を!

于 2012-06-18T04:47:00.680 に答える
0

http://three20.info/ このフレームワークは大いに役立ちます。それはあなたが望むように正確に機能するテーブルを持っています。「引っ張ってリフレッシュ」ゾーンはカスタマイズ可能

于 2012-06-18T03:40:57.077 に答える
0

このコードをviewDidLoadに記述します

tempView = [[UIView alloc] initWithFrame:CGRectMake(7,81,305,40)];  
lbl = [[UILabel alloc] initWithFrame:CGRectMake(40,125,250,20)];  
lbl.text = @"";  
lbl.font = [UIFont fontWithName:@"Haveltica" size:14];  
lbl.textAlignment = UITextAlignmentCenter;  
lbl.textColor = [UIColor whiteColor];  
lbl.backgroundColor = [UIColor clearColor];  
[tempView setBackgroundColor:[UIColor colorWithRed:204/255.0 green:204/255.0 blue:204/255.0 alpha:0]];  
[tempView addSubview:lbl];  
[self.view addSubview:tempView];  
isReload=YES;    


-(void)viewWillAppear:(BOOL)animated  
{

     [super viewWillAppear:animated]; 

    if(isReload==YES)
    {
        // your code;  
    }
    isReload=NO;

}   

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate  
{ 

    NSLog(@"table view height is %f",self.tblview.frame.size.height);  
    NSLog(@"scrollview oringin %f",scrollView.frame.size.height);  
    NSLog(@"Top10VC: ScrollView did end dragging");  
    if (!decelerate)   
    {  
        //[self loadImagesForOnscreenRows];  
    }  
    if(scrollView.contentOffset.y<-60)  
    {  
    [self.spinner startAnimating];  
    [self performSelector:@selector(getdata1)withObject:nil afterDelay:0.2];  

    }  

}  

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView  
{

    NSLog(@"scrollview oringin %f",scrollView.frame.size.height);  
    NSLog(@"Top10VC: ScrollView did end decelerating");  
    //[self loadImagesForOnscreenRows];  
}  

-(void) scrollViewDidScroll:(UIScrollView *)scrollView  
{ 

    tempView.frame = CGRectMake(0,-80 - scrollView.contentOffset.y , 320,80);   
    if(scrollView.contentOffset.y < -60)  
    {         
        lbl.text = @"Updating...";  
                [scrollView setContentOffset:CGPointMake(0, -100)];
    }  
    else  
    {  
        lbl.text = @"";  
    }   
}  
于 2012-06-18T05:14:40.733 に答える