76

UIRefreshControl (iOS 7 でビルド) に tintColor を設定しようとしています。ストーリーボードで tableViewController の更新を有効にしてから、ViewControllerviewDidLoadメソッドで次のことを行いました。

[self.refreshControl setTintColor:[UIColor redColor]];

だから今、リフレッシュするために引っ張ると、リフレッシュコントロールの色は確かに赤です:

赤とげのある

ビューが表示されたら自動的に更新したいので、次のようにしました。

- (void)viewDidAppear:(BOOL)animated{
    [self.refreshControl beginRefreshing];
}

https://stackoverflow.com/a/16250679/1809736によると、糸車は表示されませんでした。

[self.tableView setContentOffset:CGPointMake(0, -self.refreshControl.frame.size.height) animated:NO];

強制的に表示します。表示されますが、デフォルトの色に戻りました:

ここに画像の説明を入力

後で手動でプルして更新しようとすると、赤になります。

iOS6 でビルドしてみましたが、正常に動作するので、iOS7 のバグですか?

PS: シミュレーターの問題ではありません。デバイス上でビルドしてみましたが、同じバグです。

PPS: サンプル プロジェクトを作成しました。同じバグがあるか、私のコードに問題があるか教えていただけますか? ここにリンクがあります:http://d.pr/f/pGrV

どうもありがとう !

4

19 に答える 19

54

ちょっと、この正確な問題に出くわしました。

興味深いことに、最初に contentOffset を設定してから beginRefreshing を呼び出してコードを修正しました

if(self.tableView.contentOffset.y == 0){
    self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height);
    [self.refreshControl beginRefreshing];
}

このプロセスをアニメーション化することができます:

[UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^(void){
    self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height);
} completion:^(BOOL finished) {
    [self.refreshControl beginRefreshing];
}];

これがお役に立てば幸いです。

W

于 2013-12-04T18:27:06.997 に答える
28

迅速な解決策!に次のコードを挿入しますviewDidLoad

self.refreshControl.tintColor = UIColor.orangeColor()
self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height)
self.refreshControl.beginRefreshing()

スウィフト 3.1

self.refreshControl.tintColor = UIColor.orange
self.tableView.contentOffset = CGPoint(x:0, y:-self.refreshControl.frame.size.height)
self.refreshControl.beginRefreshing()
于 2015-07-04T19:13:39.593 に答える
4

これらの回答はどれもiOS8で正しく機能していません。最も近いのは@jpsimの回答ですが、フェードインアニメーション中に見苦しい黒いリフレッシュコントロールが残っていました(アニメーションの過程で黒とその間でクロスフェードします) )。

私にとってうまくいった解決策は、viewDidLoad で更新コントロールを作成した直後にこれを配置することでした。

self.refreshControl = [[UIRefreshControl alloc] init];
self.refreshControl.tintColor = [UIColor whiteColor];
...
self.refreshControlHeight = self.refreshControl.frame.size.height;
[self.tableView setContentOffset:CGPointMake(0, -1) animated:NO];
[self.tableView setContentOffset:CGPointMake(0, 0) animated:NO];

次に、UIRefreshControl をプログラムで表示します。

[self.tableView setContentOffset:CGPointMake(0, self.tableView.contentOffset.y-self.refreshControlHeight) animated:YES];
[self.refreshControl beginRefreshing];

リフレッシュ コントロールの高さを保存する必要がありました。これは、最初の呼び出しで設定されている間、後続の呼び出しでは高さが 0 になるためです。

于 2014-12-09T01:22:41.997 に答える
3

迅速:

私は Swift と > iOS8 を使用しています。説明されている回避策のほとんどは、私にはうまくいきませんでした。それが私がそれを機能させた方法です:

ビューでDidLoad:

customRefreshControl.tintColor = UIColor.clearColor()

以下は、viewDidLoad 内にある必要はありません。tableViewを更新するたびに呼び出される追加の関数に入れました:

private func startRefreshControlAnimation() {

    self.tableView.setContentOffset(CGPointMake(0, -self.customRefreshControl.frame.size.height), animated: true)

    CATransaction.begin()
    self.customRefreshControl.beginRefreshing()
    CATransaction.commit()

}
于 2015-09-30T09:37:15.593 に答える
2

Xamarin (C#) を使用して iOS 用に開発したところ、同じ問題に遭遇しました。

の を設定して、色付けの問題を修正しましAttributedTitleRefreshControl

private CGPoint originalOffset;
...
public override void ViewDidLoad ()
{
     base.ViewDidLoad ();
     ...
     originalOffset = TableView.ContentOffset; // Store the original offset of the table view
     RefreshControl = new UIRefreshControl (){ TintColor = UIColor.Red };
     RefreshControl.ValueChanged += ((s,e) => { Update (this, EventArgs.Empty); });
     // Hack so the TintColor of the RefreshControl will be properly set
     RefreshControl.AttributedTitle = new NSAttributedString ("Fetching data");
}

私の Update メソッドは次のようになります。

private async void Update(object sender, EventArgs args)
{
     try {
          TableView.UserInteractionEnabled = false;
          // I find -100 to be a big enough offset
          TableView.SetContentOffset (new CGPoint (0, -100), true);
          RefreshControl.BeginRefreshing ();
          ... // Fetch data & update table source 
          TableView.ReloadData ();
      } catch(Exception) {
          // Respond to exception
      } finally {
          // Put the offset back to the original
          TableView.SetContentOffset (originalOffset, true);
          RefreshControl.EndRefreshing ();
          TableView.UserInteractionEnabled = true;
      }
}

一度ViewDidAppear、私はプログラムで呼び出しUpdateます。帰属タイトルを設定する前は、私のスピナーは黒でした。これで適切な赤色になりました。

この「ハック/修正」には 2 つ目のバグも含まれていることに注意してください。初めて更新すると、AttributedTitleが表示されないことに気付くでしょう。2 回目 (3 回目、4 回目、...) に更新すると、タイトルが正しく表示されます。ただし、タイトルが必要ない場合は、空の文字列で初期化するだけでよく、これは大きな問題ではありません。

これが他の人に役立つことを願っています。

于 2016-03-07T16:51:54.653 に答える
1

このハックは非常に機能しています

var refreshWasProgramBeginning: Bool = false

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if !refreshWasProgramBeginning {
        UIView.animate(withDuration: 0.25, animations: {
            self.tableView.contentOffset = CGPoint.init(x: 0, y: -self.refreshControl.frame.height)
        }) { (_) in
            self.refreshControl.beginRefreshing()
            self.refreshWasProgramBeginning = true
        }
    }
}
于 2016-10-24T08:10:41.010 に答える
1

これは、プロパティbeginRefreshing()を設定した直後にリフレッシュ コントロールを呼び出した場合 (または(詳細はこちら) から呼び出した場合) に発生するバグです。ただし、呼び出しをステートメント内にラップすることで簡単な回避策があります(Swift 4):tintColorviewDidLoad()beginRefreshing()defer

override func viewDidLoad() {
    super.viewDidLoad()
    refreshControl.tintColor = .red
    defer {
        refreshControl.beginRefreshing()
    }
}
于 2018-07-24T21:09:36.667 に答える
0

私はいくつかの回避策を見つけました。うまくいくことを願っています

 [_TBL setContentOffset:CGPointMake(0,_TBL.contentOffset.y-_refreshControl.frame.size.height) animated:YES];
[_refreshControl performSelector:@selector(beginRefreshing) withObject:nil afterDelay:0.25];
[self getLatestUpdates];
于 2015-02-22T10:39:43.097 に答える
0

私が設定したとき

tableView.refreshControl = refreshControl 

refreshControl が毎回異なるインスタンスであることが何度かありましたが、更新コントロールの色が常に黒で、色合いの色を別の値に設定しても問題が解決しないという問題がありました。

一度だけ設定tableView.refreshControl = refreshControlし、非表示にする必要があるときにアルファ値を設定するように、このスレッドで詳細を説明します。

UIRefreshControl を「非表示」にするにはどうすればよいですか?

于 2019-01-31T13:48:47.203 に答える