2016-01-26 5 views
13

UIView, SegmentedController & UIContainerView в ScrollView или что-то подобное?Как сделать вид прокрутки? Точно так же, как профиль Instagram

В моей раскадровке у меня есть VC, содержащий UIView наверху, сегментированный контроллер посередине & 2 ContainerViewControllers внизу с вложенными segue в новые VC.

В новом VC у меня есть TableView & CollectionView (например, профиль Instagram).

Моя проблема в том, что мне нужно, чтобы SegmentedController и UIView прокручивались с помощью ContainerView (TableView/CollectionView), на данный момент только часть элементов ContainerView прокручивается, а части выше, которые исправлены.

Теперь я предполагаю, что мне, вероятно, нужно поместить все в UIScrollView, поэтому я попробовал, чтобы & правильно разместил все драгоценности. Но когда дело дошло до его настройки в файле Swift, я только сейчас знаю, как установить высоту прокрутки, но, очевидно, высота, которая мне нужна, может варьироваться и не является фиксированной высотой!

Если кто-нибудь может помочь мне здесь, это было бы фантастическим или, может быть, указать на аналогичный вопрос, который уже задан здесь? Я уже посмотрел, но ничего не нашел!

Вот изображение ниже объяснения в основном то, что я после этого, если выше, я был не очень понятно ..

вот пример вы можете увидеть: https://github.com/Jackksun/ScrollIssue

enter image description here

+0

держать Баунти открытым я буду обновлять мой ответ с образцом рабочего кода, когда я пришел домой –

+0

@thibautnoah эй, вы нашли решение? –

+0

Почему бы вам просто не использовать 'tableViewController'? – lukaivicev

ответ

1

Так как я понял, вы хотите, чтобы ваш прокрутка отображал штрихи за пределами его границ. Вы можете добиться этого, переопределив метод hitTest: withEvent: на представлении, которое фактически получает штрихи.

Вот пример того, что я сделал в своем проекте. Я подклассифицировал UIView и перенаправил все касания, которые он получал к определенному виду. В вашем случае вы будете перенаправлять все касания для просмотра прокрутки.

.h file: 

@import UIKit.UIView; 

/*! 
@class   TouchableView 
@abstract  Touchable view. 
*/ 
@interface TouchableView : UIView 

/*! 
@property  viewToReceiveTouches 
@abstract  View that receives touches instead of a given view. 
*/ 
@property (nonatomic, weak) IBOutlet UIView *viewToReceiveTouches; 

@end 
.m file: 

@import UIKit.UIButton; 
@import UIKit.UITableView; 
@import UIKit.UITextField; 

#import "TouchableView.h" 

@implementation TouchableView 

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    if ([self shouldViewReceiveTouch:self inPoint:point]) 
    { 
     return [super hitTest:point withEvent:event]; 
    } 
    else if (CGRectContainsPoint(self.bounds, point) && self.isUserInteractionEnabled) 
    { 
     return self.viewToReceiveTouches; 
    } 

    return nil; 
} 

- (BOOL)shouldViewReceiveTouch:(UIView *)view inPoint:(CGPoint)point 
{ 
    if (!CGRectContainsPoint(view.bounds, point) || !view.isUserInteractionEnabled) 
    { 
     return NO; 
    } 

    if ([view isKindOfClass:[UIButton class]] || 
     [view isKindOfClass:[UITextField class]] || 
     [view isKindOfClass:[UITableViewCell class]] || 
     [view isKindOfClass:[UITableView class]]) 

    { 
     return YES; 
    } 

    for (UIView *subview in view.subviews) 
    { 
     if ([self shouldViewReceiveTouch:subview inPoint:[view convertPoint:point toView:subview]]) 
     { 
      return YES; 
     } 
    } 

    return NO; 
} 

@end 
+0

Привет, за это, я просто собираюсь поместить его в код Swift, чтобы лучше понять его! То, что я пытаюсь достичь, похоже на профиль instagram, где у вас есть усезованный контроллер, но все виды прокручиваются –

+1

всегда лучше, когда вы хотя бы переписываете код, а не просто копируете его :) – Charles

+0

Эй , Это не сработало точно, но это определенно привело меня на правильный путь! благодаря вам мне удалось понять это –

0

Так как ваш высота может меняться, самый простой способ, на мой взгляд, делать то, что вы хотите, - это положить все в UICollectionView. Segue? Нет проблем, внесите didSelectRowAtIndexPath, измените свои данные и высоту и перезагрузите UICollectionView. Вы также можете добавить UICollectionView к простому UIView, который позволит вам разместить на нем статический контент.

Вот пример приложения, чтобы продемонстрировать это: https://github.com/tirrorex/Apps/tree/master/Swift/Sampleapp

Вы должны реализовать динамическую высоту, вы можете найти некоторые темы на этом (в основном вы можете сделать специальный случай для ячейки, содержащей ваш CollectionView/tableview, так что эта ячейка будет загружаться из nib, что может вам помочь): UICollectionView Self Sizing Cells with Auto Layout

+0

Что вы имеете в виду? поставить сегментированный контроллер и т. д. все внутри коллекцииView? –

+1

Да, это именно то, что я имею в виду. Каждый компонент вашего vc станет конкретной ячейкой коллекции (или tableview, если вам не нужно слишком много настроек). Итак, каждая ячейка представляет собой uiview, и вы добавляете каждый компонент в качестве подзаголовка, что позволит вам удалять и обновлять определенные элементы, не касаясь остальных. –

+0

Если я поместил UIView в tableViewCell, я бы не смог создать IBOutlets для подключения к элементам в этом UIVIew (например, Labels, ImageViews ...). Я попытался сделать то, что вы упомянули, в tableView, и я всегда получал ошибку примерно так: IBOutlets не могут быть связаны с возможными повторяющимися ячейками (что-то подобное в любом случае) –

0

Вы можете установить динамический размер для содержимого прокрутки. Вот что я сделал.

  • Определите dynamicHeight, чтобы сохранить новую таблицу TableView/CollectionView.
  • Каждый раз, когда вы меняете управление сегментом, получаете высоту контроллера-контроллера и обновляете размер содержимого прокрутки.

Посмотрите на моем коде (демо here)

@IBAction func selectPage(sender: AnyObject) { 

    // clear all child controller before load new controller 
    for controller in childViewControllers { 

     controller.removeFromParentViewController() 
    } 

    for view in pageContainer.subviews { 

     view.removeFromSuperview() 
    } 

    let segment = sender as! UISegmentedControl 

    if segment.selectedSegmentIndex == 0 { 

     createImageController() 
    } 
    else { 

     createTextController() 
    } 

    updateScrollContentSize() 
} 

func updateScrollContentSize() { 

    // 150 is your view and segment height 
    scrollView.contentSize = CGSize(width: view.frame.size.width, height: dynamicHeight + 150) 
} 

func createTextController() { 

    let textController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("TextController") as! TextController 
    dynamicHeight = textController.getTableContentHeight() 
    textController.tableView.scrollEnabled = false 

    self.addChildViewController(textController) 
    pageContainer.addSubview(textController.view) 
    textController.view.frame = CGRectMake(0, 0, pageContainer.frame.size.width, dynamicHeight) 
} 

func createImageController() { 

    let imageController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ImageShowController") as! ImageShowController 
    dynamicHeight = imageController.getTableContentHeight() 
    imageController.tableView.scrollEnabled = false 

    self.addChildViewController(imageController) 
    pageContainer.addSubview(imageController.view) 
    imageController.view.frame = CGRectMake(0, 0, pageContainer.frame.size.width, dynamicHeight * 2) 
} 

Надеется, что это может помочь.

+0

Привет, спасибо, что я играл вокруг с ним какое-то время. Но в моем TableView & CollectionView я не знаю, сколько изображений у них будет, это может быть 3 или может быть 30. Из вашего кода я понимаю, что вы вычисляете высоту представления в зависимости от того, сколько изображений, и у меня есть попытался сделать подобное, но он, похоже, не работает! (Я использую Parse для загрузки моих изображений), если это способ сделать это, не зная, сколько изображений/высоты они будут, это было бы отлично! –

+0

добавьте делегата, чтобы обновить таблицуView/collectionView при выполнении загрузки. см. мою демоверсию, я обновляю новый код там. – truongky

+0

Я только что попробовал, это то, что я вижу (так же, как и раньше) http://i.stack.imgur.com/9DHIN.png, тогда, когда я нажимаю на другую вкладку и возвращаюсь к первому, ничего не появляется ? –

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