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:
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:
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 !
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
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()
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.
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.
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()
}
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
})
}
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.
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
}
}
}
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()
}
}
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.
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 :)
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:
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()
}
}
Stellen Sie die tintColor Ihres UIRefreshControl in viewWillAppear ein.
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.
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()
......
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()
}
}
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];