如何水平居中滚动视图的内容?

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 在 vi​​ewDidLoad 和 viewWillAppear 上为零,但在 viewDidAppear 中不为零?

【问题讨论】:

【参考方案1】:

为什么 self.scrollView.contentSize.width 在 vi​​ewDidLoad 和 viewWillAppear 上为零,但在 viewDidAppear 中不为零?

当方法 viewDidLoadviewWillAppear 被调用时,视图还没有出现。所以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];

【讨论】:

以上是关于如何水平居中滚动视图的内容?的主要内容,如果未能解决你的问题,请参考以下文章

滚动视图的水平居中内容

如何在滚动视图中将内容居中?

根据内容居中水平 UICollectionView

启用分页时将水平可滚动集合视图的单元格居中并使其他单元格部分可见

UIScrollView 不会随着里面的内容视图滚动

如何在视图中居中滚动视图