如何水平居中滚动视图的内容?
Posted
技术标签:
【中文标题】如何水平居中滚动视图的内容?【英文标题】:How to horizontally center the content of the scroll view? 【发布时间】:2014-09-15 23:23:08 【问题描述】:在 viewDidLoad 中,我将按钮添加到循环内的滚动视图中,如下所示:
for (int i = 0; i < self.topics.count; i++)
id obj = self.topics[i];
if ([obj isKindOfClass:[TRBTaxonomy class]])
TRBTaxonomy *topic = obj;
UIButton *prevTopicButton = nil;
if (i > 0)
prevTopicButton = buttons[i-1];
//Create topic divider
UILabel *topicsDividerLabel =[[UILabel alloc] init];
[topicsDividerLabel setBackgroundColor:[UIColor lightGrayColor]];
[topicsDividerLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
UIButton *topicButton = [UIButton buttonWithType:UIButtonTypeSystem];
topicButton.translatesAutoresizingMaskIntoConstraints = NO;
[topicButton setTitle:topic.name forState:UIControlStateNormal];
[topicButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
topicButton.titleLabel.font = [UIFont fontWithName:(NSString*)[[TRBUtils fonts] valueForKey:@"TopicsBarFontName"] size:15];
topicButton.titleLabel.textAlignment = NSTextAlignmentLeft;
[topicButton addTarget:self action:@selector(topicTapped:) forControlEvents:UIControlEventTouchUpInside];
[self.scrollView addSubview:topicButton];
然后,在循环结束时,我尝试获取滚动视图内容的宽度,以将其放置在滚动视图中的水平中心:
CGFloat newContentOffsetX = (self.scrollView.contentSize.width/2) - (self.scrollView.bounds.size.width/2);
self.scrollView.contentOffset = CGPointMake(newContentOffsetX, 0);
但此时 self.scrollView.contentSize.width 返回 0
当我从 viewDidAppear 获取内容时,有一个内容并且一切正常,但是将滚动视图内容从左侧移动到中心时会出现明显的闪烁。
如何摆脱这种眨眼?为什么 self.scrollView.contentSize.width 在 viewDidLoad 和 viewWillAppear 上为零,但在 viewDidAppear 中不为零?
【问题讨论】:
【参考方案1】:为什么 self.scrollView.contentSize.width 在 viewDidLoad 和 viewWillAppear 上为零,但在 viewDidAppear 中不为零?
当方法 viewDidLoad
和 viewWillAppear
被调用时,视图还没有出现。所以contentSize
为 0 应该不奇怪。
如何摆脱这种眨眼?
试试这个方法
- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated
CGFloat newContentOffsetX = (self.scrollView.contentSize.width/2) - (self.scrollView.bounds.size.width/2);
[self.scrollView setContentOffset:CGPointMake(newContentOffsetX, 0) animated:YES];
【讨论】:
以上是关于如何水平居中滚动视图的内容?的主要内容,如果未能解决你的问题,请参考以下文章