iphone - develop - xcode beta



iOS 7 UIRefreshControl tintColor non funziona per beginRefreshing (10)

Aggiungi un'estensione per UIResfreshControl.

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()
    }
}

Sto cercando di impostare una tintaColor sul mio UIRefreshControl (basato su iOS 7). Ho abilitato l'aggiornamento per tableViewController nello storyboard, quindi nel mio metodo viewDidLoad ho fatto quanto segue:

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

Così ora, quando tiro per aggiornare, il colore del controllo di aggiornamento è in effetti rosso:

Voglio che la mia vista si aggiorni automaticamente quando appare, così ho fatto:

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

Non ha mostrato la ruota che gira, secondo https://stackoverflow.com/a/16250679/1809736 , ho aggiunto

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

forzare mostrarlo. Lo mostra, ma ora torna al colore predefinito:

Se provo manualmente a tirare per aggiornare in seguito, è rosso.

Ho provato a costruirlo su iOS6 e funziona come dovrebbe, quindi è un bug iOS7?

PS: non è un problema con il simulatore, ho provato a costruirlo sul dispositivo, lo stesso bug.

PPS: ho creato un progetto di esempio, puoi dirmi se hai lo stesso bug o se c'è un problema nel mio codice? Ecco il link: http://d.pr/f/pGrV

Molte grazie !


Answer #1

Ehi, sono appena entrato in questo esatto problema.

È interessante notare che ho corretto il mio codice impostando contentOffset prima di chiamare beginRefreshing

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

Potresti voler animare questo processo:

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

Spero che questo ti aiuti.

W


Answer #2

Ho combinato alcune delle risposte precedenti. Funziona per me su iOS 9 e 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
    })        
}

Answer #3

Ho creato una categoria UIRefreshControl + beginRefreshing drop-in che risolve questo problema.

In breve, risolve il problema di tintColor e manualmente tableView regola contentOffset per assicurarsi che il controllo di aggiornamento sia visibile. Per favore prova :)


Answer #4

Nessuna di queste risposte funziona correttamente per me su iOS8, con la risposta più vicina a @ jpsim, ma che ha comunque lasciato un antiestetico controllo di aggiornamento durante la sua animazione di dissolvenza (potrebbe dissolversi in dissolvenza tra il nero e il tempo durante l'animazione ).

La soluzione che ha funzionato per me è stata quella di metterlo subito dopo aver creato il controllo di aggiornamento nel mio 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];

Quindi per mostrare UIRefreshControl a livello di codice:

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

Ho dovuto memorizzare l'altezza del controllo di aggiornamento, mentre mentre era impostato per il primo richiamo, le chiamate successive avrebbero un'altezza 0.


Answer #5

Prova a impostare il colore tinta del tuo UIRefreshControl in viewWillAppear.


Answer #6

SWIFT:

Sto usando Swift e> iOS8. La maggior parte delle soluzioni alternative descritte non ha funzionato per me. È così che ho funzionato:

In viewDidLoad:

customRefreshControl.tintColor = UIColor.clearColor()

Il seguente non deve essere all'interno di viewDidLoad. L'ho messo in una funzione extra che viene chiamata ogni volta che aggiorno il TableView:

private func startRefreshControlAnimation() {

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

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

}

Answer #7

Soluzione per il problema tintColor: aggiungi questo in viewDidLoad

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

Ora hai un indicatore bianco quando chiami beginRefresh manualmente.


Answer #8

Sviluppo per iOS utilizzando Xamarin (C #) e ho riscontrato lo stesso problema.

Ho risolto il problema della colorazione, impostando il AttributedTitle di RefreshControl :

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

Il mio metodo di aggiornamento è simile al seguente:

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

Una volta ViewDidAppear , chiamo Update programmazione. Prima di impostare il titolo attribuito, il mio spinner sarebbe stato nero. Ora ha il giusto colore rosso.

Vale la pena notare che questo 'hack / fix' ha anche un secondo bug. La prima volta che si aggiorna, si noterà che AttributedTitle non viene visualizzato. L'aggiornamento di un secondo (, terzo, quarto, ...) tempo visualizzerà correttamente il titolo. Ma se non vuoi un titolo, lo inizializzi semplicemente con una stringa vuota, e questo non è un grosso problema per te.

Spero che questo possa essere utile agli altri.


Answer #9

ho trovato alcuni lavori intorno spero che funzioni per voi

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




ios7