是否可以在 UIView 而不是 UIViewController 中使用 UIScrollView?

Posted

技术标签:

【中文标题】是否可以在 UIView 而不是 UIViewController 中使用 UIScrollView?【英文标题】:Is it possible to use UIScrollView in a UIView and not in a UIViewController? 【发布时间】:2013-07-24 07:02:33 【问题描述】:

是否可以在 UIView 中使用 UIScrollView 而不是 UIViewController?

我尝试在 UIView 中使用,但这不起作用。我找不到适合我的项目的示例。

我需要在大小为 90x90 像素的视图上水平滚动。

这是我的代码

    UIScrollView* scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 35, 400, 200)];
    [scrollView setScrollEnabled:YES];
    scrollView.pagingEnabled = YES;
    [scrollView setDelegate:self];
    scrollView.backgroundColor = [UIColor brownColor];
    [scrollView setShowsHorizontalScrollIndicator:YES];
    [scrollView setIndicatorStyle:UIScrollViewIndicatorStyleDefault]; scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    scrollView.contentMode = UIViewContentModeScaleToFill;
    [scrollView setContentSize:CGSizeMake(630,0)];

    [self addSubview:scrollView];


    //self.frame = CGRectMake(0, 0, 1024, 768);

    [self setBackgroundColor:[[UIColor blackColor] colorWithAlphaComponent:0.8]];


    circleView = [[UIView alloc] initWithFrame:CGRectMake(100,100,90,90)];        
    circleView.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:1];
    //circleView.layer.borderColor = [[UIColor blackColor] CGColor];
    //circleView.layer.borderWidth = 4;

    UILabel* circleIndex = [[UILabel alloc] init];
    circleIndex.frame    = CGRectMake(30, 25, 40, 40);
    [circleIndex setFont:[UIFont fontWithName:@"Arial-BoldMT" size:40]];
    [circleIndex setText:@"A"];

    [circleView addSubview:circleIndex];


    circleView2 = [[UIView alloc] initWithFrame:CGRectMake(100+100,100,90,90)];
    circleView2.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:1];

    circleView3 = [[UIView alloc] initWithFrame:CGRectMake(100+100+100,100,90,90)];
    circleView3.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:1];

    circleView4 = [[UIView alloc] initWithFrame:CGRectMake(100+100+100+100,100,90,90)];
    circleView4.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:1];

    circleView5 = [[UIView alloc] initWithFrame:CGRectMake(100+100+100+100+100,100,90,90)];
    circleView5.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:1];

    circleView6 = [[UIView alloc] initWithFrame:CGRectMake(100+100+100+100+100+100,100,90,90)];
    circleView6.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:1];

    [scrollView addSubview:circleView];

    [scrollView addSubview:circleView2];

    [scrollView addSubview:circleView3];

    [scrollView addSubview:circleView4];

    [scrollView addSubview:circleView5];

    [scrollView addSubview:circleView6];



    exitView = [[UIView alloc] initWithFrame:CGRectMake(70,-5,30,30)];
    exitView.layer.cornerRadius = 15;

    exitView.backgroundColor = [UIColor redColor];
    exitView.layer.borderColor = [[UIColor whiteColor] CGColor];
    exitView.layer.borderWidth = 2;

    [circleView addSubview:exitView];

    UIView *exitLabel = [[UIView alloc] initWithFrame:CGRectMake(8,13,15,3)];
    exitLabel.backgroundColor = [UIColor clearColor];
    exitLabel.layer.borderColor = [[UIColor whiteColor] CGColor];
    exitLabel.layer.borderWidth = 2;


      [exitView addSubview:exitLabel];

    UILongPressGestureRecognizer *longPress =
    [[UILongPressGestureRecognizer alloc] initWithTarget:self
                                                  action:@selector(handleLongPress:)];
    [circleView addGestureRecognizer:longPress];

    UITapGestureRecognizer *singlePress =
    [[UITapGestureRecognizer alloc] initWithTarget:self
                                                  action:@selector(handleSinglePress:)];
    [exitView addGestureRecognizer:singlePress];
    //[longPress release];


    UITapGestureRecognizer *singlePress2 =
    [[UITapGestureRecognizer alloc] initWithTarget:self
                                            action:@selector(singlePress:)];
    [circleView2 addGestureRecognizer:singlePress2];



    [exitView setHidden:YES];

    [circleView bringSubviewToFront:exitView];




    [exitView setUserInteractionEnabled:YES];



return self;

【问题讨论】:

是的,这是可能的。请分享您的代码。 请分享您的代码。 UIScrollViewUIView 的子类。任何 UIView 实例都可以是任何其他 UIView 的子视图。 我已经添加了我的代码,我无法看到滚动效果 为什么你的 contentSize 的高度为 0? 【参考方案1】:

我按原样粘贴了你的代码,我也能看到滚动。 你的代码好像被粘贴到了- (id)initWithFrame:(CGRect)frame 的自定义视图。 你为你的观点提供的框架是什么?

【讨论】:

【参考方案2】:

我认为的问题是内容大小没有正确定义

[scrollView setContentSize:CGSizeMake(630,0)];

宽度为 630,高度为 0 表示您尝试实现水平滚动。尝试一些更大的内容大小并尝试滚动代码看起来不错

我尝试了一个带有滚动视图的uiview,效果很好

@implementation TestView

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
        [self setBackgroundColor:[UIColor yellowColor]];
        UIScrollView* scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 35, 600, 600)];
        [scrollView setScrollEnabled:YES];
        scrollView.pagingEnabled = YES;
        scrollView.backgroundColor = [UIColor blueColor];
        [scrollView setShowsHorizontalScrollIndicator:YES];
        [scrollView setIndicatorStyle:UIScrollViewIndicatorStyleDefault]; scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        scrollView.contentMode = UIViewContentModeScaleToFill;
        [scrollView setContentSize:CGSizeMake(630,0)];

        [self addSubview:scrollView];



    
    return self;

添加到 VC 中

TestView *view=[[TestView alloc]initWithFrame:CGRectMake(20, 30, 500, 600)];

[self.view addSubview:view];

【讨论】:

他提到他只需要水平滚动。这不是问题。

以上是关于是否可以在 UIView 而不是 UIViewController 中使用 UIScrollView?的主要内容,如果未能解决你的问题,请参考以下文章

旋转设备时是不是可以对 UIView 使用自定义旋转?

了解 UIView 是不是是从 UITabBar 的更多菜单中推送的

在 UIView 外部(而不是内部)添加边框

UIView 是不是可见?

如果 Swift 通过值而不是引用传递,为啥我可以通过将 UIView 传递给函数来在 Swift 中操作 UIView 的属性? [复制]

将 UIView 添加到已添加到 MainView 的子视图中