首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态UIButton定位?

动态UIButton定位?
EN

Stack Overflow用户
提问于 2012-12-01 09:45:26
回答 2查看 457关注 0票数 0

我有奖励,用户可以在我的游戏中获得。现在只有在解锁的情况下才会显示。他们可以得到4种不同的奖励。现在他们可能有一个奖励解锁或2或3或4。然而,我希望图像被动态定位,所以它看起来像下面的图像。在下图中,每一行看起来都应该是解锁的奖励数量。

现在,我该如何继续这样做呢?(注意:图像不会在Y轴上变化,它们只会动态地定位在X轴上,所以不要被图像所欺骗)

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-02 01:41:06

我将创建一个定制的UIView子类来实现这一点,这样您就可以在任何可以使用视图的地方使用它。

使用

代码语言:javascript
运行
复制
MyFlexibleSpacedButtons *myButtons = [[MyFlexibleSpacedButtons alloc] initWithFrame:CGRectMake(50, 50, 250, 60)];
[myButtons setButtonAtIndex:2 hidden:NO];
[myButtons setButtonAtIndex:0 hidden:NO];
[self.view addSubview:myButtons];

下面是示例类:

MyFlexibleSpacedButtons.h

代码语言:javascript
运行
复制
#import <UIKit/UIKit.h>

@interface MyFlexibleSpacedButtons : UIView

@property (nonatomic, readonly) NSArray *allButtons;

- (void)setButtonAtIndex:(NSUInteger)index hidden:(BOOL)hidden;

@end

MyFlexibleSpacedButtons.m

代码语言:javascript
运行
复制
#import "MyFlexibleSpacedButtons.h"

const NSUInteger    maxButtons          = 9;
const NSUInteger    buttonsPerRow       = 3; // This can not be 0.
const CGFloat       buttonHeight        = 50;
const CGFloat       buttonWidth         = 50;
const CGFloat       spaceBetweenButtons = 10.0;

@interface MyFlexibleSpacedButtons ()
@property (nonatomic, readwrite) NSArray        *allButtons;
@end

@implementation MyFlexibleSpacedButtons

@synthesize allButtons;

- (id)initWithFrame:(CGRect)frame
{
    NSUInteger numberOfRows = ceil((double)maxButtons / (double)buttonsPerRow);
    CGFloat    minHeight    = buttonHeight * numberOfRows + spaceBetweenButtons * (numberOfRows - 1);
    if (frame.size.height < minHeight)
    {
        frame.size.height = minHeight;
    }

    CGFloat minWidth = buttonWidth * maxButtons + spaceBetweenButtons * (maxButtons-1);
    if (frame.size.width < minWidth)
    {
        frame.size.width = minWidth;
    }

    self = [super initWithFrame:frame];
    if (self) {
        // Defaults
        // Uncomment the following line if needed for debugging:
        // self.backgroundColor = [UIColor grayColor];

        // Create the buttons and add them to the array.  Default to hidden buttons
        self.allButtons = [NSArray new];
        for (int i = 0; i < maxButtons; i++)
        {
            UIButton *button   = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            button.hidden      = YES;
            [button setTitle:[NSString stringWithFormat:@"%d", i] forState:UIControlStateNormal];
            [self addSubview:button];
            self.allButtons = [self.allButtons arrayByAddingObject:button];
        }

        [self setButtonFrames];
    }
    return self;
}

- (void)dealloc
{
    allButtons = nil;
}

- (void)setButtonFrames
{
    CGFloat viewHeight                  = self.bounds.size.height;
    CGFloat viewWidth                   = self.bounds.size.width;

    NSUInteger  buttonCount             = [self visibleButtonsCount];
    NSUInteger  numberOfRows            = ceil((double)maxButtons / (double)buttonsPerRow);
    CGFloat     buttonY                 = (viewHeight - buttonHeight * numberOfRows - spaceBetweenButtons * (numberOfRows - 1)) / 2;
    CGFloat     buttonGroupTotalWidth   = buttonCount * buttonWidth + (buttonCount - 1) * spaceBetweenButtons;
    CGFloat     buttonGroupStartingX    = (viewWidth - buttonGroupTotalWidth) / 2;

    // Set frames of buttons
    NSUInteger  visibleButtonIndex      = 0;
    for (int i = 0; i < maxButtons; i++)
    {
        UIButton *button    = [self.allButtons objectAtIndex:i];

        if (!button.hidden)
        {
            CGFloat buttonX     = buttonGroupStartingX + visibleButtonIndex % buttonsPerRow * (buttonWidth + spaceBetweenButtons);
            button.frame        = CGRectMake(buttonX, buttonY, buttonWidth, buttonHeight);
            visibleButtonIndex++;

            if (visibleButtonIndex % buttonsPerRow == 0)
            {
                buttonY = buttonY + buttonHeight + spaceBetweenButtons;
            }
        }
    }
}

- (void)setButtonAtIndex:(NSUInteger)index hidden:(BOOL)hidden
{
    if (index > maxButtons - 1)
    {
        return;
    }

    UIButton *button    = [self.allButtons objectAtIndex:index];
    button.hidden       = hidden;

    [self setButtonFrames];
}

- (NSUInteger)visibleButtonsCount
{
    NSUInteger buttonCount = 0;

    for (UIButton *button in self.allButtons)
    {
        if (!button.hidden)
        {
            buttonCount++;
        }
    }
    return buttonCount;
}

@end
票数 1
EN

Stack Overflow用户

发布于 2012-12-01 10:11:24

我认为最简单、更灵活的方法是使用带有- (void)NumberOfButtonsInCell:(NSUInteger)buttons;方法的UITableView和自定义单元格

因此,当在tableView数据源中调用时

您只需将按钮的数量相应地设置为

代码语言:javascript
运行
复制
- (void)numberOfButtonsInCell:(NSUInteger)buttons {
  int i;
  for (i = 0; i<buttons;i++) {
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake((cell.frame.size.widht/buttons)*i, 0, buttonWidth, buttonHeight)];

  button.tag = i;

  [self addSubview:button];

    [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

  }
}

- (void)buttonPressed:(id)sender {
   UIButton *button = (UIButton*)sender;

   [self.delegate userDidSelectButtonAtIndex:(button.tag)];
   //so your table view resolves the row with [self.tableView indexPathForCell:cell];



}

这样您就可以为[cell configureButtonAtIndex:index];设置一个方法

只需几行代码,您就可以轻松地更改所有行为、外观甚至设计。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13655550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档