以编程方式将UIScrollView添加到UIView在viewDidLoad中不起作用但在viewDidAppear中工作?

时间:2016-04-29 13:58:00

标签: ios objective-c iphone uiscrollview viewdidload

我正在使用自动布局。

我以编程方式将一个scrollview添加到uiview,如下面的代码所示。我试图在视图中运行initShopView加载,但它只是不工作,并没有添加scrollview进行查看。我看到了视图层次结构捕获。

class variables:

@property(strong,nonatomic) UIScrollView *shopScrollView;
@property(strong,nonatomic) UIView *headView;
@property(strong,nonatomic) UIButton *favoriteButton;


- (void)viewDidLoad {
    [super viewDidLoad];
    [self initShopView];// not work

}

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    [self initShopView];// will work
}

-(void)initShopView{
    self.shopScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.superview.frame.size.height - slideTitleHeight)];
    self.shopScrollView.contentSize = CGSizeMake(self.view.frame.size.width, 800);
    self.headView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 100)];

    self.favoriteButton = [[UIButton alloc]initWithFrame:CGRectMake(self.view.frame.size.width - 60, 10, 55, 55)];
    [self.favoriteButton setTitle:@"Favorite" forState:UIControlStateNormal];
    [self.favoriteButton setImage:[UIImage imageNamed:@"favoriteGreen.png"] forState:UIControlStateNormal];



    [self.headView addSubview:self.favoriteButton];
    [self.shopScrollView addSubview:self.headView];
    [self.view addSubview:self.shopScrollView];
}

@Phillip Mills提供解决方案。我的滚动视图框架是

self.shopScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.superview.frame.size.height - slideTitleHeight)];

解决方案是:

self.shopScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - slideTitleHeight)];

3 个答案:

答案 0 :(得分:3)

viewDidLoad中,您的视图没有superview,因为它尚未插入到视图层次结构中。这意味着您要为滚动视图设置零高度。

如果您使用Xcode的视图调试,您将在列表中看到滚动视图,但框架“错误”。

答案 1 :(得分:0)

这是viewDidAppear方法中的b'coz,您将获得视图的实际布局(帧)。

要在viewDidLoad中工作,您需要在[self initShopView];方法之上调用这些方法。

[self setNeedsLayout];

[self layoutIfNeeded];

注意:使用autolayout时,建议不要设置视图。您只需要提供约束来查看以将其置于正确的位置。

答案 2 :(得分:0)

使用AutoLayout设置视图,而不是创建框架。它将在viewDidLoad中工作。 框架使视图呈现更复杂,并且无法在所有设备尺寸上正常工作。