如何制作视图滚动?就像Instagram的个人资料一样

时间:2016-01-26 10:20:29

标签: ios swift uiview uiscrollview

UIView,SegmentedController& ScrollView中的UIContainerView或类似的东西?

在我的故事板中,我有一个顶部有一个UIView的VC,中间有一个分段控制器。 2底部的ContainerViewControllers,嵌入了新VC的segue。

在新的VC中我有一个TableView& CollectionView(例如,Instagram个人资料)。

我的问题是我需要使用SegmentedController和UIView来滚动ContainerView(TableView / CollectionView),此时只有ContainerView部件滚动并且上面的部分是固定的。

现在我猜我可能需要将所有内容放入UIScrollView中,所以我尝试了这个&正确地放置了所有的成本。但是当它在Swift文件中进行配置时,我现在只是如何设置滚动的高度,但是我需要的高度显然可以变化并且不是固定的高度!

如果有人能在这里帮助我,那会非常棒,或者可能会指出我已经在这里提出的类似问题?我已经看了,但遗憾的是没找到任何东西!

下面的图片基本上解释了我之后的情况,如果上面我不是很清楚..

以下是您可以看到的示例:https://github.com/Jackksun/ScrollIssue

enter image description here

3 个答案:

答案 0 :(得分:2)

据我了解,您希望滚动视图在其范围之外接收触摸。您可以通过覆盖实际接收触摸的视图上的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

答案 1 :(得分:0)

由于你的身高可能会有所不同,我认为最简单的方法就是将所有内容放在!important中。 Segue公司?没问题,执行UICollectionView,更改数据和高度,然后重新加载didSelectRowAtIndexPath。 您还可以将UICollectionView添加到简单的UICollectionView,这样您就可以在其上添加一些静态内容。

这是一个示例应用来证明这一点: https://github.com/tirrorex/Apps/tree/master/Swift/Sampleapp

你必须实现一个动态高度,你可以在其上找到一些线程(基本上你可以为包含你的collectionview / tableview的单元格做一个特殊情况,这样这个单元格将从nib加载,这可能对你有帮助) : UICollectionView Self Sizing Cells with Auto Layout

答案 2 :(得分:0)

您可以为scrollview内容设置动态大小。这就是我做的。

  • 定义dynamicHeight以存储新的TableView / CollectionView高度。
  • 每次更改分段控件时,获取子控制器高度并更新scrollview内容大小。

查看我的代码(演示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)
}

希望这可以提供帮助。