以编程方式添加的子视图框架不会显示在滚动视图中

Posted

技术标签:

【中文标题】以编程方式添加的子视图框架不会显示在滚动视图中【英文标题】:Programmatically added subview frames don't show up right in scrollview 【发布时间】:2015-09-04 20:52:13 【问题描述】:

我正在以编程方式创建一个滚动视图,以及其中的所有视图。但是,当我添加超过 1 个视图时,其他视图层不会正确显示在它们各自的框架中。

例如:

-(void)viewDidLoad 
  [super viewDidLoad];

  self.scrollView = [[UIScrollView alloc] init];
  self.scrollView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
  self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width, 150*5);
  self.scrollView.backgroundColor = [UIColor lightGrayColor];
  self.scrollView.scrollEnabled = YES;
  self.scrollView.showsVerticalScrollIndicator = NO;
  [self.view addSubview:self.scrollView];

  [self setUpLogInButtons];

然后我将 subViews 设置为 scrollView 在这里:

-(void)setUpLogInButtons 
  CGFloat subviewWidth = self.scrollView.frame.size.width/2;
  CGFloat subviewHeight = 150;

  UIView *facebookView = [[UIView alloc] init];
  facebookView.frame = CGRectMake(0, 0, subviewWidth, subviewHeight);
  [facebookView.layer insertSublayer:[self gradientLayerForViewFrame:facebookView.frame withColors:[self colorArrayWithValues:0x4A5C81 v2:0x495B82 v3:0x495B82 v4:0x475B85 v5:0x465B87 v6:0x455A88 v7:0x445A8A v8:0x435A8B v9:0x425A8D v10:0x41598F v11:0x405990 v12:0x3F5992 v13:0x3E5993 v14:0x3D5895 v15:0x3C5896 v16:0x3B5898 v17:0x3A589A]] atIndex:0];
  [facebookView addSubview:[self label:self.facebookLabel forView:facebookView withName:@"Facebook" loggedIn:NO]];
  [self.scrollView addSubview:facebookView];

当它是一个 subView 时效果很好,当我添加另一个时它不正确:

-(void)setUpLogInButtons 
  ...
  UIView *facebookView = [[UIView alloc] init];
  ...
  [self.scrollView addSubview:facebookView];

  UIView *twitterView = [[UIView alloc] init];
  twitterView.frame = CGRectMake(subviewWidth, 0, subviewWidth, subviewHeight);
  [twitterView.layer insertSublayer:[self gradientLayerForViewFrame:twitterView.frame withColors:[self colorArrayWithValues:0x2BA8D5 v2:0x28A8D6 v3:0x25A8D8 v4:0x22A8D9 v5:0x20A9DB v6:0x1DA9DC v7:0x1AA9DE v8:0x18AADF v9:0x15AAE1 v10:0x12AAE3 v11:0x10ABE4 v12:0x0DABE6 v13:0x0AABE7 v14:0x08ACE9 v15:0x05ACEA v16:0x02ACEC v17:0x00ADEE]] atIndex:0];
  [twitterView addSubview:[self label:self.twitterLabel forView:twitterView withName:@"Twitter" loggedIn:NO]];
  [self.scrollView addSubview:twitterView];

这个没有显示出来,图层特别关闭。然而,这是踢球者,标签显示在正确的位置,因为标签框架是基于它的父视图框架。

-(UILabel *)label:(UILabel *)viewLabel forView:(UIView *)accountView withName:(NSString *)name loggedIn:(BOOL)loggedinStatus 
  UILabel *label = viewLabel;
  label.frame = CGRectMake(0, accountView.frame.size.height - 50, accountView.frame.size.width, 50);
  label.text = [self setAccountLabelForName:name loggedIn:loggedinStatus];
  label.textColor = [UIColor whiteColor];
  label.textAlignment = NSTextAlignmentLeft;

  return label;

这是一张图片,显示标签基于父视图框架,并且显示正确,但渐变不正确,并且基于同一框架。

还有我的渐变方法:

-(CAGradientLayer *)gradientLayerForViewFrame:(CGRect)viewFrame withColors:(NSArray *)colors 
  CAGradientLayer *gradient = [CAGradientLayer layer];
  gradient.frame = viewFrame;
  gradient.colors = colors;

  return gradient;

【问题讨论】:

您是否尝试过使用不同的背景颜色和/或更改框架位置?此外添加 [self.Scrollview bringSubviewToFront: twitterView]; !您还可以尝试将 Facebook 渐变更改为 Twitter 渐变,以查看颜色是否可见。 @MasterRazer 颜色是可见的,它只是在屏幕外。而且我不需要把它带到前面,因为标签被添加到视图中,这意味着视图就在那里。所以我推断我的渐变方法有问题。我会展示它 我认为渐变方法很好,因为您的 facebook 视图工作正常。您是否尝试过使用不同的颜色值?不幸的是,我以前从未使用过渐变。 你自己搞定了! :) 晚安 【参考方案1】:

由于某种原因,在将渐变层插入视图层时,我不得不更改它:

//INSTEAD OF THIS:
[... insertSublayer:[self gradientLayerForViewFrame:facebookView.frame...];

//THIS WORKED FLAWLESSLY:
[... insertSublayer:[self gradientLayerForViewFrame:facebookView.bounds...];

【讨论】:

以上是关于以编程方式添加的子视图框架不会显示在滚动视图中的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 10 - 以编程方式添加按钮时,滚动视图不允许滚动

以编程方式将 UIScrollView 滚动到 Swift 中的子 UIView(子视图)的顶部

滚动视图上不显示文本视图

如何以编程方式设置滚动视图高度

IOS swift scrollview以编程方式

以编程方式具有自动布局的滚动视图