以编程方式创建UIScrollView

3

我正在尝试通过编程创建一个UIScrollView。我设置了一个属性并进行了合成。

@property (weak, nonatomic) IBOutlet UIScrollView *topScrollView;
@synthesize topScrollView;

我有一个方法可以做到这一点。
[topScrollView setFrame:CGRectMake(320, 0, 320, 65)];
[topScrollView setContentSize:CGSizeMake(500, 100)];
[topScrollView setBackgroundColor:[UIColor greenColor]];
[topScrollView setScrollEnabled:YES];
[topScrollView setShowsHorizontalScrollIndicator:YES];
[topScrollView setShowsVerticalScrollIndicator:NO];
[[self view] addSubview:topScrollView]; 

我将这段代码放在了viewDidLoad方法中。但是并没有创建滚动视图。我认为这是因为滚动视图还没有初始化。我可以在上面的方法中进行分配和初始化,但是当我想在另一个方法中使用它时就无法工作了。我查看了Programmatically added UIScrollView used in multiple methods,但没有什么帮助。可能有一个简单的解决方案,我不知道。我该如何编写代码来动态创建这个滚动视图,并能够在其他方法中使用它(主要是用于执行动画)。
谢谢,
伊万

顺便提一下 - 摆脱 IBOutlet。仅在使用 Interface Builder 时需要,而不是在以编程方式创建它时。 - rmaddy
@rmaddy为了完整起见,应该说IBOutlet不会有任何影响,而且它留下了一个可能性,即您可以从.xib或storyboard中设置滚动视图。 - Caleb
1
可能是如何以编程方式创建UIScrollView?的重复问题。 - Cœur
4个回答

2
我认为这是因为滚动视图还没有初始化。
没错。
我可以在上面的方法中进行分配和初始化,但是当我想在另一个方法中使用它时,它将无法工作。
如果您将新创建的滚动视图分配给属性或实例变量,则可以。那就是它们的作用。
哦,还有一件事。您需要确保以某种方式保留您的滚动视图。这意味着更改您的topScrollView属性为strong,或将其添加到视图中(然后将会保留它),或两者都要做。

好的,所以我创建了实例变量:UIScrollView* topScrollView; 并且成功让它工作。后来我用 topScrollView = [[UIScrollView alloc]init(); 进行了初始化。这个方法有效。你提到的另一个建议是关于属性的,那里我需要做些什么呢? - Ivan Aguilar

0

您可以使用以下代码在您的视图上添加UIScrollView:

步骤1:

Delegate "UIScrollViewDelegate" to your ViewController.h

for example:
  @interface yourViewController:UIViewController<UIScrollViewDelegate> 

步骤2:

//create you UIScrollView
UIScrollView  *MyScrollVw= [[UIScrollView alloc]initWithFrame:CGRectMake(0 ,0 ,320 ,480)]; 
MyScrollVw.delegate= self;
[MyScrollVw setShowsHorizontalScrollIndicator:NO];
[MyScrollVw setShowsVerticalScrollIndicator:YES];
MyScrollVw.scrollEnabled= YES;
MyScrollVw.userInteractionEnabled= YES;
[yourView addSubview:MyScrollVw];
MyScrollVw.contentSize= CGSizeMake(320 ,1500);//(width,height)

步骤三:

您需要在ViewController.m中实现scrollView的代理。

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
   return imgView;
}
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
   NSLog(@"Did end decelerating");
   //do your code here
}   
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
   NSLog(@"Did scroll");
   //do your code here
}
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    NSLog(@"Did end dragging");
   //do your code here
}
-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
    NSLog(@"Did begin decelerating");
   //do your code here
}
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
   NSLog(@"Did begin dragging");
   //do your code here
}

0

在SWIFT中简单的编程方式

总之

创建一个UIScrollView

let scrollView = UIScrollView() 
scrollView.translatesAutoresizingMaskIntoConstraints = false

使用单个子视图来容纳所有的内容子视图。
let contentView = UIView()
contentView..translatesAutoresizingMaskIntoConstraints = false

通常情况下,您只想让内容沿一个方向滚动。大多数情况下是垂直滚动。因此,请将内容视图的宽度设置为滚动视图的宽度。
NSLayoutConstraint.activate([
    contentView.widthAnchor.constraint(equalTo: scrollView.widthAnchor)

将我们的单个内容视图与滚动视图连接,附加四个约束条件(顶部、底部、左侧、右侧)。

    contentView.topAnchor.constraint(equalTo: scrollView.topAnchor),
    contentView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
    contentView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
    contentView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),

请确保将约束条件附加到内容视图的四个边缘,以便它可以扩展到您的内容的大小。
// After Adding your subviews to the contentView make sure you've those two constraints set:

    firstSubView.topAnchor.constraint(equalTo: contentView.topAnchor),
    .
    .
    .
    lastSubView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
])

参考资料:iOS中使用UIScrollView和自动布局


0

简单方法:如果需要,您可以创建多个实例。

- (void)scrollView
{

    int x = 0;
    int y = 10;
    for(int i=0; i<5; i++)
    {
        UIScrollView *scrollview=[[UIScrollView alloc]initWithFrame:CGRectMake(x, y, 50, 50)];
        scrollview.showsVerticalScrollIndicator=YES;
        scrollview.scrollEnabled=YES;
        scrollview.userInteractionEnabled=YES;
        scrollview.backgroundColor = [UIColor greenColor];
        [self.view addSubview:scrollview];
        //scrollview.contentSize = CGSizeMake(50,50);
        x=x+55;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接