0

我正在为其他人制作的应用程序创建与 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 点的位置,对吗?有没有更优雅或更有目的性的方式来做到这一点?

4

1 回答 1

0

掩码与在 IB 或代码中创建时的掩码相同。但是,您要确保在代码中做的事情是确保框架设置正确比例一次。在您的情况下,是的,您确实需要 UIViewAutoResizingFlexibleTopMargin,并根据 y = parentView.bounds.size.height - (如您所描述的 x 点)在原点上设置正确的 y 值,这就是您需要做的一切。

编辑:根据您更新的问题,也许这会对您有所帮助。如果按钮具有恒定大小,请在创建按钮时将框架设置为以 CGPointZero 作为原点的大小。如果 UIView 拥有该按钮,则将此代码放在 layoutSubviews 中。如果 UIViewController 拥有该按钮,请将 self.bounds 替换为 self.view.bounds 并将其放入 view(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。

于 2012-10-05T20:38:00.933 回答