添加对象后,为什么UIScrollView不能完全滚动?使用storyboard,ARC和Xcode 4.5.2

时间:2012-12-29 00:08:02

标签: iphone ios uiscrollview storyboard autolayout

所以,我知道我的问题也有类似的问题,但也许并不准确(所以请不要让我失望 - 只是警告我或者别的什么)。我已经搜索了解决这个简单问题的日子。使用故事板,ARC和Xcode 4.5.2,我只需要在UIScrollView中放置一堆标签并让它垂直滚动。我在viewDidLoad,viewDidAppear和viewWillAppear中尝试了很多设置帧大小和内容大小的组合,但无济于事。 当滚动视图内部没有任何内容时,滚动视图会完美滚动,但当我向其添加标签时,滚动只会滚动很短的部分。

注意:我需要使用自动布局,否则我的整个项目都会搞砸。

这是我目前的代码......

.h文件:

#import <UIKit/UIKit.h>

@interface MortgageRatesViewController : UIViewController <UIScrollViewDelegate, UIScrollViewAccessibilityDelegate>

- (IBAction)backButton:(id)sender;

@property (strong, nonatomic) IBOutlet UIView *mortgageView;

@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;

@end

.m文件:

#import "MortgageRatesViewController.h"


@interface MortgageRatesViewController ()

@end

@implementation MortgageRatesViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

//-------------------------------------------------------

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"appBackgroundColor.png"]];


    [self.scrollView setScrollEnabled:YES];
    [self.scrollView setContentSize:CGSizeMake(0, 809)];



}

//---------------------------------------------------------------

//---------------------------------------------------------------

//-(void)viewWillAppear:(BOOL)animated{
//    
//    
//    [super viewWillAppear:animated];
//    
//    
//    [self.scrollView setFrame:CGRectMake(0, 0, 320, 808)];   
//
//    
//}

//---------------------------------------------------------------

-(void)viewDidAppear:(BOOL)animated
{

    [super viewDidAppear:animated];

    [self.view addSubview:self.scrollView];
    [self.scrollView setScrollEnabled:YES];
    [self.scrollView setContentSize:CGSizeMake(0, 809)];

}

//-------------------------------------------------------------

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)backButton:(id)sender {

    [self dismissViewControllerAnimated:YES completion:NO];

}
@end

注意:将viewWillAppear注释掉后没有任何区别。

编辑:我发布了解决方案。希望它能帮助其他人!

3 个答案:

答案 0 :(得分:39)

经过几天的研究,有趣的是我在发布这个问题后几分钟就找到了解决方案!所以,对于我的情况,我只需要添加这段代码,它就可以了:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    [self.scrollView setContentSize:CGSizeMake(320, 808)];
}

现在似乎工作得很好。请任何人,让我知道这是否是一种糟糕的做法,因为我是新手,我会很乐意得到任何帮助。否则,我会离开它,希望这可以帮助其他人!谢谢!

答案 1 :(得分:3)

使用Storyboard + Autolayout解决方案(无代码):

从左上角开始的垂直滚动示例:

  • 设置第一个对象(子视图)的顶部+前导约束
  • 链接每个对象直到最后一个
  • 最重要的 - 将底部约束设置为滚动视图,以便它从上到下连接。
  • 设置滚动视图的width - 特定的&#34;幻数&#34;或者更好的方法 - 连接具有设定宽度的子视图的尾随约束 - 如果不是,我通常设置标签宽度=屏幕宽度 - 侧面填充=&gt; 标准(20)+ UILabel (280)+ 标准(20) - 这样滚动视图就可以准确地知道其内容的宽度否则你会得到一个不明确的宽度&#34;警告。

*需要约束&#39;如果需要水平滚动,请进行调整。

答案 2 :(得分:2)

你的scrollview的框架不是可滚动的尺寸。

查看contentSize

将帧设置为superview.bounds,然后将内容大小设置为scroolview的可滚动区域。

我也不知道背景会滚动。

您需要将子视图添加到滚动视图本身。

它应滚动自己的子视图。但它不会自行滚动:)