2014-02-03 3 views
3

Я заинтересован в реализации пейджингового UIScrollView, очень похожего на текущее приложение Twitter, где есть основной подкачки UIScrollView (горизонтальная прокрутка) в верхней части иерархии представлений и несколько других (вертикальные прокрутка) UIScrollViews или UITableViews как подстраница подкачки UIScrollView.Choppy Paging UIScrollView Experience

Я принимал ссылку от this WWDC video, где они описали, как мы могли бы добавить/несколько «масштабирования» scrollViews в качестве подсмотра большего «прокручиваемого» прокрутки.


В моей текущей настройки, у меня есть: ViewController в раскадровке с иерархией следующим образом: View> ScrollView (contentScrollView)> Несколько подвидов (UIImageViews, UIButtons и UILabels).

Когда этот вид загружается, я вызываю метод setupPagingScrollView в своем представленииDidAppear.

- (void)setupPagingScrollView 
{ 
    // Setup the PAGING UIScrollView 
    self.pagingScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 340, self.view.frame.size.height)]; 
    self.pagingScrollView.contentSize = CGSizeMake(680, self.view.frame.size.height); 
    self.pagingScrollView.pagingEnabled = YES; 
    self.pagingScrollView.backgroundColor = [UIColor blackColor]; 

    // Remove the CONTENT UIScrollView (from storyboard) from the view. 
    // Add the CONTENT UIScrollView (from storyboard), as a subview of the newly created PAGING UIScrollView 
    [self.contentScrollView removeFromSuperview]; 
    [self.pagingScrollView addSubview:self.contentScrollView]; 
    [self.view addSubview:self.pagingScrollView]; 


    // Create the 2nd page, which is a UITableView 
    self.tableView = ({ 
     UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(340, 0, 320, self.view.frame.size.height) style:UITableViewStylePlain]; 
     tableView.delegate = self; 
     tableView.dataSource = self; 
     tableView.backgroundColor = [UIColor whiteColor]; 
     tableView.tableFooterView = [UIView new]; 
     tableView.contentInset = UIEdgeInsetsMake(50, 0, 0, 0); 
     tableView; 
    }); 
    [self.pagingScrollView addSubview:self.tableView]; 


    // UINavigationBar for the UITableView in the 2nd page. 
    self.likesCommentsNavBar = ({ 
     UINavigationBar *navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(340, 0, 320, 44)]; 
     UINavigationItem *navItem = [[UINavigationItem alloc] init]; 

     UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:@[@"Likes", @"Comments"]]; 
     [segmentedControl addTarget:self action:@selector(toggleLikesCommentsWithSegmentedControl:) forControlEvents:UIControlEventValueChanged]; 
     segmentedControl.selectedSegmentIndex = 0; 

     navItem.titleView = segmentedControl; 
     navBar.items = @[navItem]; 

     navBar; 
    }); 

    [self.pagingScrollView addSubview:self.likesCommentsNavBar];\ 
} 

Мой предназначен конечный результат будет что-то вроде приложения щебет, только что вместо панорамирование между 3 UITableViews, мой первый взгляд был бы настраиваемое представление с некоторыми изображениями, этикетки и кнопки, и Вторая и третья страницы будут UITableViews.

Я создал макет моего предполагаемого результата

enter image description here

В настоящее время я могу получить результат, я хочу, но я понимаю, что есть некоторая зыбь в исполнении. Я делаю что-то неправильно здесь, выделяя память на столько просмотров или что-то еще?

Большое спасибо!

+1

изображения загружаются при прокрутке может быть виновником (если это произойдет в все) при загрузке изображений вы можете загрузить их в фоновом потоке, а затем представить их в основном потоке, чтобы поток пользовательского интерфейса не был заблокирован при загрузке изображений, не уверен, что это фактическая причина вашей проблемы, но у меня была эта проблема до и это сделало мой опыт прокрутки намного более плавным. – Fonix

+0

У вас есть больше кода для этого примера, в котором вы работаете? Я действительно интересен в чем-то вроде приложения Twitter. Спасибо – mikemike396

+0

@ Pyraego.com Я понял, что тот, кто делает все порывистым, был self.likesCommentsNavBar. Я похвалил этот кусок, и производительность вернулась к норме. Однако я не знаю, почему. – Ryan

ответ

0

Incase нагрузки изображения на главном потоке проблема здесь, вот простой способ загрузки изображений в фоновом потоке

UIImageView *imageView = [[UIImageView alloc] init]; // can be your IBOutlet or something instead 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 

    UIImage *image = [UIImage imageNamed:@"imageName"]; 

    dispatch_sync(dispatch_get_main_queue(), ^{ 

     imageView.image = image; //can add some fade in animation or something here too 
    }); 
}); 
+0

Привет @Fonix, на самом деле, я не уверен, что проблема с загрузкой изображений. Производительность ослабляется, даже если UITableViews (которые не отображаются) имеют пустые источники данных. UIImageView на первом пользовательском UIScrollView является только одним изображением сам по себе и загружает только один раз. Я на самом деле думал, что это потому, что я выделяю память на 3 UIScrollViews, что не очень хорошо, так как другие 2 представления прокрутки еще не отображаются. – Ryan

+0

странно, устройство должно легко иметь возможность обрабатывать 3 scrollviews без дрожания, хотя ... к сожалению, я не уверен, что проблема может быть тогда, возможно, что-то происходит в другом месте приложения за кулисами, создавая это представление? – Fonix

Смежные вопросы