iOS:以编程方式对齐屏幕底部的按钮x像素

时间:2012-10-05 20:24:25

标签: ios button margins autoresizingmask

我正在为其他人制作的应用创建iOS6的兼容性。我习惯使用自动化蒙版制作按钮/ UI元素,但是当你以编程方式创建按钮时,我真的不知道它们是如何工作的。

例如:

- (UIButton*) createSampleButton {
    UIButton* b = createSampleViewButton(CGRectMake(67, 270, 191, 45), 
                                          @"btn_shuffle", 
                                          @"btn_shuffle_active",
                                          self,
                                          @selector(sampleAction));
    b.autoresizingMask = UIViewAutoresizingFlexibleTopMargin;
    [self attachButton:b];
    return b;
}

如何更改这些按钮,使它们按照某种比例/边距放置,而不是任意选择点,直到所有“看起来都正确”?

我想的是:

- (UIButton*) createSampleButton {
    CGFloat height = self.bounds.size.height;
    CGFloat bottomBound = 80;
    UIButton* b = createSampleViewButton(CGRectMake(67, height-bottomBound, 191, 45), 
                                          @"btn_shuffle", 
                                          @"btn_shuffle_active",
                                          self,
                                          @selector(sampleAction));
    [self attachButton:b];
    return b;
}

这样可以保证按钮每次都放在离屏幕底部80个点的位置吗?有没有更优雅或有目的的方式来做到这一点?

1 个答案:

答案 0 :(得分:0)

掩码与在IB或代码中创建的掩码相同。您希望确保在代码中执行的操作是确保框架按比例正确设置一次。在你的情况下,是的,你确实需要UIViewAutoResizingFlexibleTopMargin,并在y = parentView.bounds.size.height - (如你所描述的x点)方面在原点上设置正确的y值,这就是你需要做的。

编辑: 根据您更新的问题,也许这会对您有所帮助。如果按钮具有恒定大小,请在创建按钮时使用CGPointZero作为原点将帧设置为该大小。如果UIView拥有该按钮,则将此代码放在layoutSubviews中。如果UIViewController拥有该按钮,则将self.bounds替换为self.view.bounds并将其置于视图中(Will / Did)LayoutSubviews(假设iOS5 +)。

    // Aligning the button at it's current x value, current size, with its bottom border margin pizels from the bottom of the parent view.
    CGFloat margin = 10;
    CGRect buttonFrame = button.frame;
    buttonFrame.origin.y = self.bounds.size.height - buttonFrame.size.height - margin;
    button.frame = buttonFrame;

此外,在实现文件的顶部定义常量值。随意创建方便的可读性方法(如果你发现它更具可读性,而不是在一行上做太多),例如

    CGRect CGSetYInRect(CGFloat y, CGRect rect)
    ...
    button.frame = CGSetYInRect(self.bounds.size.height - button.frame.size.height - margin, button.frame);

在适当时使用AutoResizing以避免layoutSubviews中的显式逻辑。

当您仅转移到iOS 6 +时,请使用AutoLayout。