webentwicklung-frage-antwort-db.com.de

iOS 7 UIRefreshControl tintColor funktioniert nicht für beginRefreshing

Ich versuche, eine TintColor-Einstellung für mein UIRefreshControl (unter iOS 7) festzulegen. Ich habe die Aktualisierung für den tableViewController im Storyboard aktiviert und dann in meiner ViewController-Methode viewDidLoad Folgendes ausgeführt:

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

Wenn ich also zum Aktualisieren nachziehe, ist die Farbe der Aktualisierungssteuerung tatsächlich rot:

redSpiny

Ich möchte, dass meine Ansicht automatisch aktualisiert wird, wenn sie angezeigt wird.

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

Es zeigte nicht das sich drehende Rad, laut https://stackoverflow.com/a/16250679/1809736 , fügte ich hinzu

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

erzwingen zeige es . Es zeigt es, aber jetzt ist es wieder in der Standardfarbe: 

enter image description here

Wenn ich manuell versuche, nach dem Aktualisieren zu ziehen, ist es rot.

Ich habe versucht, es auf iOS6 zu erstellen, und es funktioniert so, wie es sollte. Ist also ein iOS7-Fehler?

P.S .: Es ist kein Problem mit dem Simulator, ich habe versucht, es auf dem Gerät zu bauen, der gleiche Fehler.

P.P.S: Ich habe ein Beispielprojekt erstellt. Können Sie mir sagen, ob Sie denselben Fehler haben oder ob in meinem Code ein Problem vorliegt? Hier ist der Link: http://d.pr/f/pGrV

Danke vielmals !

68
Noé Malzieu

Hey stolperte gerade in diese genaue Ausgabe.

Interessanterweise habe ich meinen Code korrigiert, indem ich zunächst contentOffset und dann beginRefreshing aufrief

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

Möglicherweise möchten Sie diesen Prozess animieren:

[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];
}];

Hoffe das hilft dir.

W

49
William George

Swift SOLUTION! Fügen Sie den folgenden Code in die viewDidLoad ein:

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

Swift 3.1

self.refreshControl.tintColor = UIColor.orange
self.tableView.contentOffset = CGPoint(x:0, y:-self.refreshControl.frame.size.height)
self.refreshControl.beginRefreshing()
20
Fox5150

Die Antwort von @ william-george brachte mich in die richtige Richtung, brachte mir aber seltsame Probleme mit der Autolayout-Animation.

Also hier ist die Version, die für mich funktioniert hat:

- (void)programaticallyRefresh {
    // Hack necessary to keep UIRefreshControl's tintColor
    [self.scrollView setContentOffset:CGPointMake(0, -1.0f) animated:NO];
    [self.scrollView setContentOffset:CGPointMake(0, -self.refreshControl.frame.size.height) animated:YES];
    [self.refreshControl beginRefreshing];
    [self refresh];
}

-refresh ist die an UIRefreshControl gebundene Methode.

8
jpsim

Unter iOS8 funktioniert keine dieser Antworten korrekt. Die engste Antwort ist @ jpsim, die jedoch während der eingeblendeten Animation ein unansehnliches schwarzes Aktualisierungssteuerelement hinterlassen hat ).

Die Lösung, die für mich funktionierte, bestand darin, diese sofort nach dem Erstellen des Refresh-Steuerelements in viewDidLoad zu übernehmen:

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];

Dann zeigen Sie UIRefreshControl programmatisch an:

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

Ich musste die Höhe des Refresh-Steuerelements speichern, da nachfolgende Aufrufe, während sie für den ersten Aufruf festgelegt wurde, eine Höhe von 0 haben.

4
Richard Sim

Schnell:

Ich verwende Swift und> iOS8. Die meisten der beschriebenen Problemumgehungen funktionierten nicht für mich. So habe ich es zum Laufen gebracht:

In viewDidLoad:

customRefreshControl.tintColor = UIColor.clearColor()

Folgendes muss nicht in viewDidLoad sein. Ich habe es in eine zusätzliche Funktion gestellt, die jedes Mal aufgerufen wird, wenn ich die tableView aktualisiere:

private func startRefreshControlAnimation() {

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

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

}
3
arm0nic

Ich habe einige der vorherigen Antworten kombiniert. Dies funktioniert für mich unter iOS 9 und Swift 2:

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

    let contentOffset = self.tableView.contentOffset.y
    UIView.animateWithDuration(0, delay: 0, options: .BeginFromCurrentState, animations: {
        print(self.tableView.contentOffset.y)
            self.tableView.setContentOffset(CGPointMake(0, -self.refreshControl.frame.size.height), animated: false)
        }, completion: { finished in
            self.refreshControl.beginRefreshing()
            self.tableView.setContentOffset(CGPointMake(0, contentOffset/2-self.refreshControl.frame.size.height), animated: true)
            self.refresh() // Code that refresh table data
    })        
}
3
Wendy Chu

Lösung für das tintColor-Problem: Fügen Sie dies in viewDidLoad hinzu

[self.refreshControl setTintColor:[UIColor whiteColor]];
[self.refreshControl tintColorDidChange];

Jetzt haben Sie einen weißen Indikator, wenn Sie beginRefresh manuell aufrufen.

2
Artjom Zabelin

dieser Hack arbeitet sehr gut 

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
        }
    }
}
1

Fügen Sie eine Erweiterung für UIResfreshControl hinzu. 

extension UIRefreshControl {
    func beginRefreshingManually() {
        self.tintColor = UIColor.white
        if let scrollView = superview as? UIScrollView {
            scrollView.setContentOffset(CGPoint(x: 0, y:scrollView.contentOffset.y - frame.height), animated: false)
        }
        beginRefreshing()
    }
}
1
Sefa Ayçiçek

Ich entwickle für iOS mit Xamarin (C #) und bin auf das gleiche Problem gestoßen.

Ich habe das Farbproblem behoben, indem ich AttributedTitle von RefreshControl gesetzt habe:

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");
}

Meine Update-Methode sieht folgendermaßen aus:

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;
      }
}

Nach dem Aufruf von ViewDidAppear rufe ich Update programmgesteuert auf . Vor dem Festlegen des Attributtitels wäre mein Spinner schwarz . Jetzt hat er die richtige rote Farbe.

Es ist erwähnenswert, dass dieser "Hack/Fix" auch einen zweiten Fehler enthält. Wenn Sie das erste Mal aktualisieren, werden Sie feststellen, dass AttributedTitle nicht angezeigt wird. Eine zweite wird aktualisiert (dritte, vierte). ...) Zeit wird der Titel richtig angezeigt. Wenn Sie jedoch keinen Titel wünschen, initialisieren Sie ihn einfach mit einer leeren Zeichenfolge, und dies ist kein großes Problem für Sie.

Ich hoffe, das kann für andere von Nutzen sein.

1
Thomas De Wilde

Ich habe eine Drop-In-Kategorie UIRefreshControl + beginRefreshing erstellt, die dieses Problem behebt. 

Kurz gesagt, das Problem von tintColor wird behoben, und tableView passt contentOffset manuell an, um sicherzustellen, dass die Aktualisierungssteuerung sichtbar ist. Bitte versuche :)

0
Hlung

Wenn ich setze 

tableView.refreshControl = refreshControl 

mehrmals, wenn refreshControl jedes Mal eine andere Instanz ist, hatte ich das Problem, dass die Aktualisierungssteuerungsfarbe immer Schwarz war und die Einstellung der Farbtonfarbe auf einen anderen Wert nicht half. 

Damit ich tableView.refreshControl = refreshControl nur einmal eingestellt habe und wenn ich es verstecken muss, setze ich den Alpha-Wert, weitere Details in diesem Thread:

Wie kann ich ein UIRefreshControl "ausblenden"?

0
Paul T.

Dies ist ein Fehler, der auftritt, wenn beginRefreshing() direkt nach dem Festlegen der tintColor-Eigenschaft (oder viewDidLoad() (Details here ) der Aktualisierungssteuerung aufgerufen wird. Es gibt jedoch eine einfache Problemumgehung, indem der beginRefreshing()-Aufruf in eine defer-Anweisung eingeschlossen wird (Swift 4):

override func viewDidLoad() {
    super.viewDidLoad()
    refreshControl.tintColor = .red
    defer {
        refreshControl.beginRefreshing()
    }
}
0
boliva

Stellen Sie die tintColor Ihres UIRefreshControl in viewWillAppear ein.

0
MacMark

Ich arbeite mit Xamarin C # (iOS 10) und habe festgestellt, dass eine Kombination all dieser Antworten für mich das Problem war. 

In meiner ViewDidLoad habe ich folgendes:

    RefreshControl = new UIRefreshControl();
    RefreshControl.TintColor = UIColor.White;
    RefreshControl.ValueChanged += OnRefresh;
    RefreshControl.BackgroundColor = UIColor.Clear;

Und später rufe ich die Aktualisierungsanimation in meiner ViewDidAppear mit dem folgenden Befehl programmgesteuert auf:

    BeginInvokeOnMainThread(() =>
    {
        UIView.Animate(0, 0.2, UIViewAnimationOptions.BeginFromCurrentState, () =>
        {
            TableView.SetContentOffset(new CGPoint(0, TableView.ContentOffset.Y - RefreshControl.Frame.Size.Height), true);
            RefreshControl.AttributedTitle = new NSAttributedString("");
        },
        () =>
        {
            RefreshControl.BeginRefreshing();
        });
    });

Beachten Sie die Einstellung des Attributtitels und des Animationsblocks. Es waren die Teile, die meiner RefreshControl fehlten, um meine weiße Tönungsfarbe aufzunehmen.

Vielen Dank an alle, die zu dieser Frage beigetragen haben.

0
Matthew

Stellen Sie den Inhaltsoffset für Ihre tableView/scrollView manuell ein, bevor Sie mit dem Drehen beginnen:

tableView.setContentOffset(CGPoint(x: 0, y: tableView.contentOffset.y - (refreshControl.frame.size.height)), animated: true)
refreshControl.beginRefreshing()
......
0
protspace

Die Verwendung von UIView.animate hat bei Swift 4 nicht funktioniert.

Hier ist was ich verwendet habe

extension UIRefreshControl {
    func beginRefreshingManually(with scrollView: UIScrollView, isFirstTime: Bool) {
        if self.isRefreshing { return }

        // Workaround: If we call setContentOffset on the first time that the screen loads
        // we get a black refreshControl with the wrong size.
        // We could just set the scrollView.contentOffset everytime, but it does not animate the scrolling.
        // So for every other time, we call the setContentOffset animated.
        if isFirstTime {
            scrollView.contentOffset = CGPoint(x: 0, y: -self.frame.size.height)
        } else {
            scrollView.setContentOffset(CGPoint(x: 0, y: -self.frame.size.height), animated: true)
        }
        self.beginRefreshing()
    }
}
0

ich habe ein paar Work Around gefunden, ich hoffe es funktioniert für Sie 

 [_TBL setContentOffset:CGPointMake(0,_TBL.contentOffset.y-_refreshControl.frame.size.height) animated:YES];
[_refreshControl performSelector:@selector(beginRefreshing) withObject:nil afterDelay:0.25];
[self getLatestUpdates];
0
khaled