【问题标题】:Position of UIActivityViewController changed on changing orientation of device?UIActivityViewController 的位置随着设备方向的改变而改变?
【发布时间】:2014-09-26 09:02:22
【问题描述】:

我正在构建一篇文章阅读应用程序。我以编程方式在 UITableViewController 中实现了 UIActivityViewController。我正面临 当我改变设备的方向时,UIActivityViewController 的位置发生了变化。

这是我的代码:

       indicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
       if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation))
        {
            indicator.center = CGPointMake(350, 300);
            [self.tableView addSubview:indicator];
            [UIApplication sharedApplication].networkActivityIndicatorVisible = TRUE;
             [indicator layoutIfNeeded];
          }

     else{

            indicator.center = CGPointMake(200, 400);
            [self.tableView addSubview:indicator];
            [UIApplication sharedApplication].networkActivityIndicatorVisible = TRUE;

        }

如果可以通过以编程方式应用约束,我该怎么做。

感谢您的帮助!

【问题讨论】:

    标签: ios objective-c uitableview constraints uiactivityindicatorview


    【解决方案1】:

    您可以拥有indicator.center = self.tableview.center 并在定向时致电[self.view layoutIfNeeded]。 无论如何,我刚刚注意到一些看起来很奇怪的东西。你做了[self.view addSubview:indicator],然后你做了[indicator bringSubviewToFront:self.view],我实际上不记得这可能是什么行为(可能什么都没有),但应该反过来,因为指标是你self.view的子视图。 另外,为什么要在else语句的主体中添加两次指示符(一次用于tableView,一次用于视图)?

    编辑:

    或者您可以使用自动布局并忘记框架。像这样的:

    NSLayoutConstraint *centerX = [NSLayoutConstraint constraintWithItem:indicator
                                                                  attribute:NSLayoutAttributeCenterX
                                                                  relatedBy:NSLayoutRelationEqual
                                                                     toItem:self.tableView
                                                                  attribute:NSLayoutAttributeCenterX
                                                                 multiplier:1
                                                                   constant:0];
    [self.view addConstraint:centerX];
    

    对 centerY 做同样的事情。

    【讨论】:

    • @thanks Dan 我在上面编辑了我的代码。[self.view layoutIfNeeded] 这不起作用。
    • 很高兴知道您的代码放在哪里。因为我看不出它对任何方向变化有何反应。当您创建指标并将其添加到视图层次结构时,您决定只应用一次哪个中心。在 iOS 7 之前,您可以在 iOS 8 上使用 didRotateFromInterfaceOrientation:,这已被弃用,您应该使用 viewWillTransitionToSize:withTransitionCoordinator:
    【解决方案2】:

    看起来您正在设置 activityIndi​​cator 第一次创建并添加到视图层次结构时的位置。但是您不会在轮换时更新该位置。

    您可以通过使用约束(centerX 和 centerY 约束)来实现此更新,如另一个响应者在此处所述,或者覆盖 layoutSubviews 并将 activityIndi​​cator 的中心点设置为 tableView 的中心。

    类似:

    - (void)layoutSubviews
    {
        [super layoutSubviews];
    
        self.activityIndicatorView.center = self.tableView.center;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多