Подтвердить что ты не робот

Как сделать вид прокрутки? Так же, как профиль Instagram

UIView, SegmentedController и UIContainerView в ScrollView или что-то подобное?

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

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

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

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

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

Вот изображение ниже, объясняющее в основном, что мне нужно, если выше я был не очень ясен.

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

введите описание изображения здесь

4b9b3361

Ответ 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

Ответ 2

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

Вот пример приложения, демонстрирующий это: https://github.com/tirrorex/Apps/tree/master/Swift/Sampleapp

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

Ответ 3

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

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

Взгляните на мой код (demo здесь)

@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)
}

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