Анимация Spinner при загрузке новой страницы
У меня есть UITableView, который из внешнего RSS-канала.
Когда вы выбираете строку, она использует navigationController и слайды справа, проблема в том, что RSS-канал содержит изображения, поэтому может потребоваться несколько секунд для загрузки и без каких-либо указаний на то, что происходит, вы можете ошибиться для сбоя приложения.
Я решил добавить счетчик, чтобы вы знали, что загружается новая страница.
Вот мой код:
RootViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"Loading New Page");
[tableView deselectRowAtIndexPath:indexPath animated:YES];
DetailsViewController *detailViewController = [[DetailsViewController alloc] initWithNibName:@"DetailsViewController" bundle:nil];
detailViewController.item = [rssItems objectAtIndex:floor(indexPath.row/2)];
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
spinner.center = CGPointMake(160, 240);
[self.view addSubview:spinner];
[spinner startAnimating];
[spinner release];
}
DetailsViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
NSString *imgURL = [item objectForKey:@"image"];
NSData *mydata = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:imgURL]];
item_photo.image = [[UIImage alloc] initWithData:mydata];
item_title.text = [item objectForKey:@"title"];
item_date.text = [NSString stringWithFormat:@"Date: %@",[item objectForKey:@"date"]];
item_time.text = [NSString stringWithFormat:@"Time: %@",[item objectForKey:@"time"]];
item_cost.text = [NSString stringWithFormat:@"Cost: £%@",[item objectForKey:@"cost"]];
item_info.text = [item objectForKey:@"description"];
self.navigationItem.title = @"Event Type";
}
С этим кодом возникают две проблемы.
- Spinner не активируется до тех пор, пока не загрузится новая страница.
- Spinner не отключается после загрузки.
Если бы кто-нибудь мог помочь мне с этой проблемой, я был бы искренне благодарен.
Ответы
Ответ 1
Вы добавляете представление индикатора активности в представление контроллера, который нажимает на контроллер подробного представления, поэтому вы его вообще не увидите
попробуйте переместить вторую группу кода в метод viewDidLoad элемента DetailsViewController, вы можете вызвать stopAnimating на индикаторе активности, когда вы закончите загрузку. Чтобы получить ссылку на UIActivityIndicator, вы должны добавить тег
например. in viewDidLoad
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
spinner.center = CGPointMake(160, 240);
spinner.tag = 12;
[self.view addSubview:spinner];
[spinner startAnimating];
[spinner release];
в методе loadFinished (какой метод вызывается при завершении загрузки)
[[self.view viewWithTag:12] stopAnimating];
Ответ 2
Вам нужно выполнить некоторую работу в фоновом потоке. Если следующая строка соответствует той, которая занимает время:
detailViewController.item = [rssItems objectAtIndex:floor(indexPath.row/2)];
Тогда вы можете сделать это в фоновом режиме с помощью GCD:
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// This is the operation that blocks the main thread, so we execute it in a background thread
id item = [rssItems objectAtIndex:floor(indexPath.row/2)];
// UIKit calls need to be made on the main thread, so re-dispatch there
dispatch_async(dispatch_get_main_queue(), ^{
detailViewController.item = item;
[spinner stopAnimating];
});
});
И +1 к @wattson12 - вам нужно добавить счетчик на новый вид. В качестве альтернативы вы можете добавить счетчик в текущее представление и вместо этого поместить вызов pushViewController
в свой основной блок GCD.
Конечная точка - вы хотите удалить счетчик из своего супервизора, как только вы остановите его оживление. Кроме того, вы можете иметь один экземпляр счетчика и установить hidesWhenStopped
в YES.
Ответ 3
Это вращающееся колесо по размытому виду в быстрой:
func blurScence(){
let blurEffect: UIBlurEffect = UIBlurEffect(style: .Dark)
let blurView: UIVisualEffectView = UIVisualEffectView(effect: blurEffect)
blurView.translatesAutoresizingMaskIntoConstraints = false
blurView.frame = self.view.frame
let spinner = UIActivityIndicatorView(activityIndicatorStyle:.White)
spinner.center=blurView.center
blurView.addSubview(spinner)
spinner.startAnimating()
self.view.addSubview(blurView)
}