如何将 MBProgressHUD 的位置固定在 UITableView 的中心

How to fix the position of MBProgressHUD to center in a UITableView

我有一个场景,我在 UITableViewController 上使用第三方库 MBProgressHUD,但问题是每当我上下滚动时,HUD 会随着滚动而移动.

我不想禁用 UITableView 滚动,而且我想将 HUD 保持在 UITableView 的中心。

有没有可能的实现方式?

问题可能是您在 tableview 中添加了 HUD,以添加到您的视图中,例如..

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.mode = MBProgressHUDModeText;
    hud.labelText = @"Loading";
}

创建MBProgressHUD对象(示例:MBProgressHUD *HUD)。初始化它并在主视图上将 HUD 添加为子视图并执行此操作

[HUD setCenter:self.view.center];
[HUD setUserInteractionEnabled:YES];

是的,有一种可能的修复方法。在 [HUD show:YES] 之前添加此代码。

HUD.yOffset = CGRectGetMinY(self.tableView.bounds);

就是这样。

看起来 HUDview.frame 被设置为超级视图的 frame,因此如果您向下滚动然后显示 HUD,它的位置是错误的.添加该行会将 HUDyOffset 添加到向下滚动量。

将 HUD 添加到 tableview 的超级视图或 navigationController.view 修复了问题:

UIView *view = self.tableView.superview;
// UIView *view = self.navigationController.view; if you are using navigationController
if (view != nil) {
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:view animated:YES];
}

这对我有用。将其设置为parentViewController,然后是View。

let spinningActivity = MBProgressHUD.showHUDAddedTo(self.parentViewController?.view, animated:true)

我尝试按照上面的说明将它添加到导航控制器,但在将它转换为 swift 时出现了一些解包错误。我发现 this fix 并且每次都有效。感谢 Aleksei Kaut :-).

- (void)showLoadingIndicator
{
  [MBProgressHUD showHUDAddedTo:[UIApplication sharedApplication].keyWindow animated:YES];
}

- (void)hideLoadingIndicator
{
  [MBProgressHUD hideAllHUDsForView:[UIApplication sharedApplication].keyWindow animated:YES];
}

Swift 3.0

 override func viewDidLoad() {
        super.viewDidLoad()

        progress = MBProgressHUD(view: view) // <<-- That's the trick
        view.addSubview(progress!)
        view.bringSubview(toFront: progress!)
        progress?.show(animated: true)
        progress?.mode = .indeterminate
        progress?.animationType = .fade
    }

解决方法很简单。当您使用 tableView 时,只需将 MBProgressHUD 附加到 UIApplication.shared.delegate?.window

对于 swift 3.0 :

显示 MBProgressHUD

MBProgressHUD.showAdded(to: ((UIApplication.shared.delegate?.window)!)!, animated: true)

隐藏 MBProgressHUD

MBProgressHUD.hide(for: ((UIApplication.shared.delegate?.window)!)!, animated: true)