Safari ve Mail gibi bazı uygulamaların, ağa erişirken durum çubuğunda (telefonun en üstündeki çubuk) bir yükleme göstergesi gösterdiğini fark ettim. SDK uygulamalarında aynı şeyi yapmanın bir yolu var mı, yoksa bu yalnızca Apple mı?
Safari ve Mail gibi bazı uygulamaların, ağa erişirken durum çubuğunda (telefonun en üstündeki çubuk) bir yükleme göstergesi gösterdiğini fark ettim. SDK uygulamalarında aynı şeyi yapmanın bir yolu var mı, yoksa bu yalnızca Apple mı?
Yanıtlar:
UIApplication içinde:
Amaç C için:
Başlat:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
Son:
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
Hızlı için:
Başlat
UIApplication.shared.isNetworkActivityIndicatorVisible = true
Son
UIApplication.shared.isNetworkActivityIndicatorVisible = false
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
// tek astar olarak
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
Aşağıdaki makroları oldukça faydalı buldum!
#define ShowNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = YES
#define HideNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = NO
Böylece, yalnızca uygulamanızdan ShowNetworkActivityIndicator();
veya HideNetworkActivityIndicator();
uygulamanızdan arayabilirsiniz (elbette başlık dahil olduğu sürece!).
Neler olduğuna dair bir sayaç tutarak birden fazla bağlantı sorununu çözen bir singleton yazdım (bir bağlantı geri döndüğünde ancak bir diğeri hala aktif olduğunda durumu kaldırmaktan kaçınmak için):
Başlık dosyası:
#import <Foundation/Foundation.h>
@interface RMActivityIndicator : NSObject
-(void)increaseActivity;
-(void)decreaseActivity;
-(void)noActivity;
+(RMActivityIndicator *)sharedManager;
@end
Ve uygulama:
#import "RMActivityIndicator.h"
@interface RMActivityIndicator ()
@property(nonatomic,assign) unsigned int activityCounter;
@end
@implementation RMActivityIndicator
- (id)init
{
self = [super init];
if (self) {
self.activityCounter = 0;
}
return self;
}
-(void)increaseActivity{
@synchronized(self) {
self.activityCounter++;
}
[self updateActivity];
}
-(void)decreaseActivity{
@synchronized(self) {
if (self.activityCounter>0) self.activityCounter--;
}
[self updateActivity];
}
-(void)noActivity{
self.activityCounter = 0;
[self updateActivity];
}
-(void)updateActivity{
UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = (self.activityCounter>0);
}
#pragma mark -
#pragma mark Singleton instance
+(RMActivityIndicator *)sharedManager {
static dispatch_once_t pred;
static RMActivityIndicator *shared = nil;
dispatch_once(&pred, ^{
shared = [[RMActivityIndicator alloc] init];
});
return shared;
}
@end
Misal:
[[RMActivityIndicator sharedManager]increaseActivity];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:self.networkReceiveProcessQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
[[RMActivityIndicator sharedManager]decreaseActivity];
}
Şebeke aramanız bittiğinde de etkinlik göstergesini gizlemeye dikkat etmeniz gerekir.
Eğer kullanırsanız AFNetworking
, fazla bir şey yapmanıza gerek kalmaz.
AppDelegate
Sınıfta aşağıdaki değişiklikleri yapın :
İthalat AFNetworking/AFNetworkActivityIndicatorManager.h
Bunu koy didFinishLaunchingWithOptions:
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]
Birçoğunun söylediği gibi, iPhone X için ve muhtemelen çentikli diğer yeni iPhone'lar için ağ etkinliği göstergesi yoktur.
Ortwin Gentz, FutureTap tarafından yazılan bu inanılmaz kitaplığa rastladım: https://github.com/futuretap/FTLinearActivityIndicator
Göstergeyi, iPhone X'in ilk piyasaya sürüldüğü zaman olduğu yere koyuyor, çoğu kişi Knight Rider tipi göstergeyi hatırlayacaktı.
Bu kitaplık Swift 4.2 için mevcuttur, bu nedenle Swift Dili ayarlarını burada açıklandığı gibi değiştirmeniz gerekecektir: 'NSAttributedStringKey' yazın (diğer adıyla 'NSString') üye 'yazı tipi' içermiyor