Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 自动布局';d控制';运行时的实际位置是什么?_Ios_Objective C_Autolayout - Fatal编程技术网

Ios 自动布局';d控制';运行时的实际位置是什么?

Ios 自动布局';d控制';运行时的实际位置是什么?,ios,objective-c,autolayout,Ios,Objective C,Autolayout,使用XCode 6.0.1,iOS 8 我有一个通过自动布局/约束放置的UI按钮 我试图以编程方式添加相对于第一个按钮定位的按钮。具体来说,我将它们添加到围绕初始按钮中心点的圆圈中。我用于查找新按钮坐标的数学正在运行,除了: autolayout’d按钮报告其相对于superview interface builder使用的536x536的原点,而不是设备的实际屏幕大小 我知道这是因为约束表示“容器中的中心X和Y”,并且它确实出现在屏幕的中间,但是不管设备/屏幕大小,Frask.Orth=(26

使用XCode 6.0.1,iOS 8

我有一个通过自动布局/约束放置的UI按钮

我试图以编程方式添加相对于第一个按钮定位的按钮。具体来说,我将它们添加到围绕初始按钮中心点的圆圈中。我用于查找新按钮坐标的数学正在运行,除了:

autolayout’d按钮报告其相对于superview interface builder使用的536x536的原点,而不是设备的实际屏幕大小

我知道这是因为约束表示“容器中的中心X和Y”,并且它确实出现在屏幕的中间,但是不管设备/屏幕大小,Frask.Orth=(268, 268),它是IB(536/2=268)中的视图的中心。 那么,有没有一种方法可以将其转换为“实际的设备坐标”,而不是原始的interface builder坐标

短暂性脑缺血发作

编辑:我需要翻译它,无论它是否居中。我意识到我可以得到设备的屏幕大小,如果它居中的话,可以除以2

Edit2:@jrturton-它在运行时在哪里报告其位置?什么财产?原点和中心位置都正确。无论如何,代码:

创建按钮:

- (void)setupButtons: (int)buttonCount
{
if ((buttonCount > MAX_BUTTONS) || (buttonCount < MIN_BUTTONS)) {
    return;
}

float totalRads = degreesToRadians(360.0);
float deltaRads = totalRads / (float)buttonCount;
float radius = 30.0f;

NSMutableArray *buttons = [[NSMutableArray alloc] init];
CGRect centerFrame = self.centerMenuButton.frame;
for (int i = 0; i < buttonCount; i++) {

    CGPoint dest = CGPointMake(
                               (radius * cosf(i * deltaRads) + centerFrame.origin.x),
                               (radius * sinf(i * deltaRads) + centerFrame.origin.y)
                               );

    CGRect frame = CGRectMake(dest.x, dest.y, 64.0, 64.0);
    UIButton *button = [[UIButton alloc] initWithFrame:frame];
    [button setImage:[UIImage imageNamed:@"pink_star"] forState:UIControlStateNormal];
    [buttons addObject:button];
}

_menuButtons = [[NSArray alloc] initWithArray:buttons];
}
每个按钮一个(目前有2个):


除了舍入误差,数学看起来是半正确的,因为X坐标每次都以正确的方向移动半径。但同样-起始坐标不正确,因为autolayout'd按钮正在报告(268268)。

NSLayoutConstraints在
LayoutSubView
之后处理。如果从自动布局视图中删除NSLayoutConstraints并替换为
UIViewAutoResisingFlexible*
常量,则在
LayoutSubView
覆盖中调用
[super LayoutSubView]
时,按钮的框架将更新


@关于中心的计算,jrturton在上面也提出了一个很好的观点。如果您的投诉是所报告的中心是其superview内的中心,则这是预期行为。如果您想要相对于屏幕的中心,则需要使用
[[UIScreen Main screen]convertPoint:point fromView:theView]
转换它。我猜您正在调用
设置按钮:
from
viewDidLoad
。这发生在视图控制器从情节提要加载其视图之后,但在系统针对当前设备和方向调整视图(及其子视图)的大小之前

我建议您通过使用约束来定位按钮而不是设置框架来解决此问题

除非两个视图位于同一视图层次中,否则两个视图之间不能有约束。因此,将按钮添加到
setupButtons:
中的视图层次结构中,但将其设置为隐藏。在
显示菜单中,使其可见

- (void)setupButtons:(int)buttonCount {
    if (buttonCount > MAX_BUTTONS |buttonCount < MIN_BUTTONS) {
        return;
    }

    float totalRads = degreesToRadians(360.0);
    float deltaRads = totalRads / (float)buttonCount;
    float radius = 30.0f;

    NSMutableArray *buttons = [[NSMutableArray alloc] init];
    UIView *centerView = self.centerMenuButton;
    for (int i = 0; i < buttonCount; i++) {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.translatesAutoresizingMaskIntoConstraints = NO;
        [button setImage:[UIImage imageNamed:@"pink_star"] forState:UIControlStateNormal];
        button.hidden = YES;
        [self.view addSubview:button];
        [buttons addObject:button];

        [button addConstraint:[NSLayoutConstraint
            constraintWithItem:button attribute:NSLayoutAttributeWidth
            relatedBy:NSLayoutRelationEqual
            toItem:nil attribute:NSLayoutAttributeNotAnAttribute
            multiplier:0 constant:64]];
        [button addConstraint:[NSLayoutConstraint
            constraintWithItem:button attribute:NSLayoutAttributeHeight
            relatedBy:NSLayoutRelationEqual
            toItem:nil attribute:NSLayoutAttributeNotAnAttribute
            multiplier:0 constant:64]];

        CGFloat radians = i * 2 * M_PI / buttonCount;
        [self.view addConstraint:[NSLayoutConstraint
            constraintWithItem:button attribute:NSLayoutAttributeCenterX
            relatedBy:NSLayoutRelationEqual
            toItem:centerView attribute:NSLayoutAttributeCenterX
            multiplier:1 constant:radius * cos(radians)]];
        [self.view addConstraint:[NSLayoutConstraint
            constraintWithItem:button attribute:NSLayoutAttributeCenterY
            relatedBy:NSLayoutRelationEqual
            toItem:centerView attribute:NSLayoutAttributeCenterY
            multiplier:1 constant:radius * sin(radians)]];
    }

    _menuButtons = [buttons copy];
}

- (void)showMenu {
    NSLog(@"showMenu");

    for (int i = 0; i < _menuButtons.count; i++) {
        UIButton *btn = _menuButtons[i];
        NSLog(@"origin: %f, %f", btn.frame.origin.x, btn.frame.origin.y);
        btn.hidden = NO;
    }

    _menuOpen = YES;
}
-(无效)设置按钮:(int)按钮计数{
如果(按钮计数>最大按钮|按钮计数<最小按钮){
回来
}
浮动总弧度=度弧度(360.0);
浮动增量=总拉德/(浮动)按钮计数;
浮动半径=30.0f;
NSMUTABLEARRY*按钮=[[NSMUTABLEARRY alloc]init];
UIView*centerView=self.centerMenuButton;
对于(int i=0;i
尝试使用内置在Xcode 6中的视图调试。执行此操作时,它将显示按钮的位置以及运行时约束和位置。以下是一份苹果文档,介绍了使用它的基本知识David L你什么时候做计算,你如何定位新按钮?我们能看到一些代码吗?自动布局定位的视图在运行时会像其他视图一样报告其位置。记住,中心属性将位于按钮superview的坐标空间中。适用于我。让我们看一些代码。编辑您的帖子,以包含创建按钮并设置其约束或位置或其他内容的代码。约束解算器在
layoutSubviews
之前运行<代码>-[UIView layoutSubviews]
将解决方案应用于
自身的子视图
RadialMenuText[14125:6281339] x: 268.000000, y: 268.000000
RadialMenuText[14125:6281339] origin: 298.000000, 268.000000
RadialMenuText[14125:6281339] origin: 238.000000, 267.999997
- (void)setupButtons:(int)buttonCount {
    if (buttonCount > MAX_BUTTONS |buttonCount < MIN_BUTTONS) {
        return;
    }

    float totalRads = degreesToRadians(360.0);
    float deltaRads = totalRads / (float)buttonCount;
    float radius = 30.0f;

    NSMutableArray *buttons = [[NSMutableArray alloc] init];
    UIView *centerView = self.centerMenuButton;
    for (int i = 0; i < buttonCount; i++) {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.translatesAutoresizingMaskIntoConstraints = NO;
        [button setImage:[UIImage imageNamed:@"pink_star"] forState:UIControlStateNormal];
        button.hidden = YES;
        [self.view addSubview:button];
        [buttons addObject:button];

        [button addConstraint:[NSLayoutConstraint
            constraintWithItem:button attribute:NSLayoutAttributeWidth
            relatedBy:NSLayoutRelationEqual
            toItem:nil attribute:NSLayoutAttributeNotAnAttribute
            multiplier:0 constant:64]];
        [button addConstraint:[NSLayoutConstraint
            constraintWithItem:button attribute:NSLayoutAttributeHeight
            relatedBy:NSLayoutRelationEqual
            toItem:nil attribute:NSLayoutAttributeNotAnAttribute
            multiplier:0 constant:64]];

        CGFloat radians = i * 2 * M_PI / buttonCount;
        [self.view addConstraint:[NSLayoutConstraint
            constraintWithItem:button attribute:NSLayoutAttributeCenterX
            relatedBy:NSLayoutRelationEqual
            toItem:centerView attribute:NSLayoutAttributeCenterX
            multiplier:1 constant:radius * cos(radians)]];
        [self.view addConstraint:[NSLayoutConstraint
            constraintWithItem:button attribute:NSLayoutAttributeCenterY
            relatedBy:NSLayoutRelationEqual
            toItem:centerView attribute:NSLayoutAttributeCenterY
            multiplier:1 constant:radius * sin(radians)]];
    }

    _menuButtons = [buttons copy];
}

- (void)showMenu {
    NSLog(@"showMenu");

    for (int i = 0; i < _menuButtons.count; i++) {
        UIButton *btn = _menuButtons[i];
        NSLog(@"origin: %f, %f", btn.frame.origin.x, btn.frame.origin.y);
        btn.hidden = NO;
    }

    _menuOpen = YES;
}