有没有办法在iOS应用程序上随机/重新排列按钮?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法在iOS应用程序上随机/重新排列按钮?相关的知识,希望对你有一定的参考价值。
我正在开发一个ios应用程序。故事板上有35个按钮。无论如何,我可以使用随机生成器随机重新排列或随机播放按钮并保持按钮的功能吗?
您可以将所有按钮对象添加到名为buttonsArray的NSMutableArray中,然后使用以下循环来交换按钮:
for (int i = 0; i < buttonsArray.count; i++) {
int random1 = arc4random() % [buttonsArray count];
int random2 = arc4random() % [buttonsArray count];
[buttonsArray exchangeObjectAtIndex:random1 withObjectAtIndex:random2];
}
如果每个按钮属于如下所示的类,那么它很容易改变它们,
MyRandomButton {
NSInteger uniqueId;
NSString *title;
....
....
}
现在,您可以做的是,在初始时,准备MyRandomButton的对象数量(等于StoryBoard上的按钮数)。并将其添加到可变数组(qazxsw poi)中。
像这样,
NSMutableArray
在下一步中,如果你已完成某些事情(并且你想要对所有按钮进行随机播放),那么请从这个问题中获得帮助,for(NSInteger index = 1; index <= 35; index++) {
MyRandomButton *btnInfo = ...;
btnInfo.uniqueId = index;
btnInfo.title = @sometitle;
[myButtonsArray addObject:btnInfo];
}
将你的数组洗牌。
循环浏览StoryBoard上的所有按钮(在您的情况下:1到35)。
What's the Best Way to Shuffle an NSMutableArray?
在上面的循环中,我们更新了按钮标题和标签。
完成!
这是可能的,它需要一些编码:
- 使用视图中的所有按钮创建NSMutableArray。
- 随机化其订单。
- 运行按钮数组并在每次迭代时保持最后一个按钮视图并使用当前按钮切换其rect,反之亦然。
为了更好地理解,这里是代码(可以使用,只需复制粘贴):
for(NSInteger index = 1; index <= 35; index++) {
UIButton *button = (UIButton *)[yourView viewWithTag:index];
MyRandomButton *btnInfo = [myButtonsArray objectAtIndex:(index-1)];
button.tag = btnInfo.uniqueId;
[button setTitle:btnInfo.title forState:UIControlStateNormal];
}
如果只是在自动布局限制方面,重新排列固定按钮听起来很头疼。
你为什么不:
- 在故事板上创建并定位35个“通用”按钮,每个按钮都有自己的插座(属性名为
- (void)viewDidLoad { [super viewDidLoad]; // Getting buttons into array NSMutableArray * buttonsArr = [self getButtonsArray]; // Shuffling buttons location if(buttonsArr && [buttonsArr count]) { [self randomizeButtonsLocation:buttonsArr]; } else { NSLog(@"No buttons found"); } } - (void)randomizeButtonsLocation:(NSMutableArray *)buttonsArr { // Randomizing order in button array buttonsArr = [self randomizeArr:buttonsArr]; UIButton * lastBtn = nil; for (UIButton * btn in buttonsArr) { if(!lastBtn) { lastBtn = btn; } else { // Put a side frames of last and current buttons CGRect lastBtnRect = [lastBtn frame]; CGRect currentBtnRect = [btn frame]; // Switch frames [btn setFrame:lastBtnRect]; [lastBtn setFrame:currentBtnRect]; // Keeping last btn for next iteration lastBtn = btn; } } } - (NSMutableArray *)getButtonsArray { // Getting all buttons in self.view and inserting them into a mutable array NSMutableArray * resultArr = [[NSMutableArray alloc] init]; for (UIButton * btn in [self.view subviews]) { if([btn isKindOfClass:[UIButton class]]) { [resultArr addObject:btn]; } } return resultArr; } - (NSMutableArray *)randomizeArr:(NSMutableArray *)arr { NSUInteger count = [arr count]; for (NSUInteger i = 0; i < count; ++i) { unsigned long nElements = count - i; unsigned long n = (arc4random() % nElements) + i; [arr exchangeObjectAtIndex:i withObjectAtIndex:n]; } return arr; }
,button01
等)或更好:使用button02
? - 为故事板上的每个按钮(0,1,2,3 ......)分配一个唯一标签。
- 为故事板上的所有按钮分配相同的outlet collection方法。
- 在运行时,随机确定并为每个按钮指定一个特定的“角色”(并相应地设置每个按钮的标签)。但是跟踪哪个按钮是哪个,例如使用
@IBAction
。 - 链接到所有按钮的操作将使用发件人的标记和上面提到的
dictionary
中包含的信息来确定点击了哪个“角色”按钮,并采取相应的行动。
是否有意义?
以上是关于有没有办法在iOS应用程序上随机/重新排列按钮?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 iPhone 模拟器上点击菜单按钮然后重新启动应用程序后查看日志记录?
在浏览器中按下后退/前进按钮时,有没有办法在重新渲染之前改变行为
有没有办法在 devexpress TreeListControl 中通过拖放重新排列节点时预览元素的位置?