iOS:UIActivityIndicator不使用弹簧和;支柱

iOS:UIActivityIndicator不使用弹簧和;支柱,ios,objective-c,Ios,Objective C,我试图在屏幕上设置一个UIActivityIndicator,它必须与屏幕底部保持相同的距离(适用于3.5英寸和4英寸iPhone)。UIActivityIndicator将作为blockerView的子视图放置,其目的是阻止用户交互 这是我的代码,但它不起作用: _blockerView = [[UIView alloc] initWithFrame: self.view.window.bounds]; [_blockerView setAutoresizingMask: ( UIViewAu

我试图在屏幕上设置一个
UIActivityIndicator
,它必须与屏幕底部保持相同的距离(适用于3.5英寸和4英寸iPhone)。
UIActivityIndicator
将作为
blockerView
子视图放置,其目的是阻止用户交互

这是我的代码,但它不起作用:

_blockerView = [[UIView alloc] initWithFrame: self.view.window.bounds];
[_blockerView setAutoresizingMask: ( UIViewAutoresizingFlexibleWidth |                       UIViewAutoresizingFlexibleHeight)];
[self.view addSubview: _blockerView];
_activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(150, 338, 20, 20)];
[_blockerView addSubview:_activityIndicator];
[_activityIndicator setAutoresizingMask: UIViewAutoresizingFlexibleTopMargin];
[_activityIndicator startAnimating];

如果你的问题是4英寸屏幕与3.5英寸屏幕的底部距离不同,那么你需要从底部进行初始计算,你的当前距离顶部

创建视图控制器时,其视图大小默认为屏幕大小。因为在您的设置中,您的初始Y位置为338,并且视图控制器的视图大小可能不会再次更改,所以底部边距将不同

相反,试试这个(从底部开始计算)


我还没有足够的观点来评论某人的答案,所以我会提出一个答案

计算activityIndicator框架相对于屏幕底部的Y位置无关紧要,因为计算是在分配给CGRectMake之前进行计算的。所以,如果它是一个固定的数字或任何语句,都没有区别

假设“self”是UIViewController实例,则使用self.view.window.bounds时会遇到问题:

  • 调用self.view.window时,该窗口甚至可能不存在(例如,inside viewDidLoad)
  • 视图控制器的边界并不总是必须等于应用程序窗口边界。视图的子视图的大小和位置应相对于ViewController的视图
  • 在第一种情况下,您将得到一个无效的rect,从而得到一个无效的自动调整大小掩码

    试试这个:
    _blockerView=[[UIView alloc]initWithFrame:self.view.bounds]

    感谢您提供此解决方案!遗憾的是,我没有足够的声誉来评价你。很抱歉不,我不在viewDidLoad中调用这段代码。它仍然不起作用。它应该通过设置一个合适的自动resizemask来工作,但我不知道如何做到这一点。在这个类中,我以编程的方式进行设置,它是一个超类,另一个超类继承自该超类,并且具有多个控件。我制作了一个通知观察者机制来通知子类它必须停止或设置该微调器的动画。(直接在interface builder上拖动的UIActivityIndicator视图正确响应interface builder中设置的struts和Spring)除非视图的大小每次都开始相同,否则固定的数字将不起作用。视图的大小开始时与UIScreen的边界大小相同,因此您需要确保原点来自视图控制器的视图大小@Meeshoo我的答案对你不管用吗?它管用,但我正在寻找一个可扩展的解决方案,而不是手动设置位置。@Meeshoo我编辑了我的答案,使其更具动态性。请注意,如果您希望从底部将其固定一定数量,那么显然需要在帧计算中手动使用该数量。@SomeGuy Ok,谢谢,现在更好了。我用以下行替换:activityindicatorframe.origin.y=\u blockerView.frame.size.height-activityindicatorframe.size.height-210;现在这个指标与我在interface builder中设置的指标完全重叠。我将继续搜索一个只有自动调整掩码的解决方案,当我找到一个时,我将更新这个线程。
    _blockerView = [[UIView alloc] initWithFrame:self.view.bounds];
    [_blockerView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
    [self.view addSubview:_blockerView];
    
    _activityIndicator = [[UIActivityIndicatorView alloc] init];
    
    CGRect activityIndictatorFrame = CGRectZero;
    activityIndictatorFrame.size = [_activityIndicator sizeThatFits:CGSizeZero];
    activityIndictatorFrame.origin.x = floorf((_blockerView.frame.size.width - activityIndictatorFrame.size.width) / 2.0);  //  X: centered
    activityIndictatorFrame.origin.y = _blockerView.frame.size.height - activityIndictatorFrame.size.height - 116;  //  Y: fixed from bottom
    
    [_activityIndicator setFrame:activityIndictatorFrame];
    [_activityIndicator setAutoresizingMask:(UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin)];
    [_blockerView addSubview:_activityIndicator];
    
    [_activityIndicator startAnimating];