0

我已经构建了一个滑动导航控制器,它允许 UIViewController 以快速流畅的方式(Facebook 风格)滑动。我已经添加了一个 UIViewController 和一个子视图控制器,它有自己的子视图控制器,以及一个表格视图。最低的子视图控制器也有一个视图子视图。此 UIViewController 具有在顶视图滑开时可见的视图。

我已经测试了有无这个视图控制器的平滑度。没有它,幻灯片以每秒 60 帧的速度运行,但有了它,我的设备只能以 20 到 30 fps 的速度运行。

我也尝试过删除似乎略有改善的子视图,但没有我预期的那么多。即使使用另一个相当复杂的视图控制器(虽然没有子视图控件)切换出来,我也会获得更好的性能。

我在整个应用程序中使用自动布局,并且开始相信这是问题所在。在发生这种糟糕的滑动时,我的任何代码都没有被执行,所以我相信它与正在计算的约束有关,因为正在显示更多视图,但不能确定。

为了避免包含整个类,这里​​是视图控制器和子视图中的 updateViewConstraint 方法:

顶视图控制器

/**
 *  Called when the view controller’s view needs to update its constraints.
 */
- (void)updateViewConstraints
{
    [super updateViewConstraints];

    //  remove all constraints
    [self.view removeConstraints:self.view.constraints];

    NSArray *constraints;

    //  add the table view to the top of the view and the parameters view to the bottom
    constraints                         = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(Panel)-[tableView]|"
                                                                options:kNilOptions
                                                                metrics:@{@"Panel": @(kPanelWidth)}
                                                                  views:self.viewsDictionary];

    [self.view addConstraints:constraints];

    constraints                         = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[tableView]-|"
                                                                options:kNilOptions
                                                                metrics:nil
                                                                  views:self.viewsDictionary];
        [self.view addConstraints:constraints];

    constraints                         = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(PanelPlus)-[recipeParameters]-|"
                                                                options:kNilOptions
                                                                metrics:@{@"PanelPlus": @(kPanelWidth + 20)}
                                                                  views:self.viewsDictionary];
    [self.view addConstraints:constraints];

    constraints                         = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[recipeParameters(==Height)]|"
                                                                options:kNilOptions
                                                                metrics:@{  @"Height"   : @(kParametersControllerHeight)}
                                                                  views:self.viewsDictionary];
    [self.view addConstraints:constraints];
}

第一儿童视图控制器

/**
 *  Called when the view controller’s view needs to update its constraints.
 */
- (void)updateViewConstraints
{
    [super updateViewConstraints];

    //  remove all constraints
    [self.view removeConstraints:self.view.constraints];

    NSArray *constraints                = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[pageView]|" options:kNilOptions
                                                                      metrics:nil views:self.viewsDictionary];
    [self.view addConstraints:constraints];

    constraints                         = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[pageView]|" options:kNilOptions
                                                                metrics:nil views:self.viewsDictionary];
    [self.view addConstraints:constraints];
}

第二个孩子视图控制器

- (void)updateViewConstraints
{
    [super updateViewConstraints];

    NSArray *constraints;

    //  remove all constraints
    [self.view removeConstraints:self.view.constraints];

    if (self.interfaceOrientation == UIInterfaceOrientationPortrait || self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        constraints                         = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(8)-[optionLabel]-[selectionWheel]-[includeExclude(==32)]-|"
                                                                    options:NSLayoutFormatAlignAllCenterX
                                                                    metrics:nil
                                                                      views:self.viewsDictionary];
        [self.view addConstraints:constraints];

        constraints                         = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[selectionWheel]-|"
                                                                    options:kNilOptions
                                                                    metrics:nil
                                                                      views:self.viewsDictionary];
        [self.view addConstraints:constraints];

        constraints                         = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[includeExclude]-|"
                                                                    options:kNilOptions
                                                                    metrics:nil
                                                                      views:self.viewsDictionary];
        [self.view addConstraints:constraints];
    }
    else
    {
        constraints                         = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[selectionWheel]-|" options:kNilOptions
                                                                    metrics:nil views:self.viewsDictionary];
        [self.view addConstraints:constraints];

        constraints                         = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[optionLabel]-[selectionWheel]-(Balance)-|"
                                                                    options:NSLayoutFormatAlignAllCenterY
                                                                    metrics:@{@"Balance": @(self.optionLabel.bounds.size.width + 40)}
                                                                      views:self.viewsDictionary];
        [self.view addConstraints:constraints];
    }
}

自定义 UICONTROL(第二个子视图控制器的子视图)

/**
 *  Update constraints for the view.
 */
- (void)updateConstraints
{
    [super updateConstraints];

    [self removeConstraints:self.constraints];
    [self.excludeButton removeConstraints:self.excludeButton.constraints];
    [self.includeButton removeConstraints:self.includeButton.constraints];

    NSArray *constraints;
    NSLayoutConstraint *constraint;

    //  add everything to fill the bounds
    constraints                         = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(==6)-[excludeButton]-(==6)-|"
                                                                options:kNilOptions
                                                                metrics:nil
                                                                  views:self.viewsDictionary];
    [self addConstraints:constraints];

    constraints                         = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[excludeButton][optionLabel][includeButton]|"
                                                                options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom
                                                                metrics:nil
                                                                  views:self.viewsDictionary];
    [self addConstraints:constraints];


    //  make the exclude and include buttons square
    constraint                          = [NSLayoutConstraint constraintWithItem:self.excludeButton attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.excludeButton attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0.0f];
    [self.excludeButton addConstraint:constraint];
    constraint                          = [NSLayoutConstraint constraintWithItem:self.includeButton attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.includeButton attribute:NSLayoutAttributeHeight multiplier:1.0f constant:0.0f];
    [self.includeButton addConstraint:constraint];
}

顶层 UIViewController 的实现在这里。

4

0 回答 0