Ios 自动布局';d控制';运行时的实际位置是什么?
使用XCode 6.0.1,iOS 8 我有一个通过自动布局/约束放置的UI按钮 我试图以编程方式添加相对于第一个按钮定位的按钮。具体来说,我将它们添加到围绕初始按钮中心点的圆圈中。我用于查找新按钮坐标的数学正在运行,除了: autolayout’d按钮报告其相对于superview interface builder使用的536x536的原点,而不是设备的实际屏幕大小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
我知道这是因为约束表示“容器中的中心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]
转换它。我猜您正在调用设置按钮:
fromviewDidLoad
。这发生在视图控制器从情节提要加载其视图之后,但在系统针对当前设备和方向调整视图(及其子视图)的大小之前
我建议您通过使用约束来定位按钮而不是设置框架来解决此问题
除非两个视图位于同一视图层次中,否则两个视图之间不能有约束。因此,将按钮添加到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;
}