IOS-uibutton的动态放置
我有一个奇怪的问题: 我正在ViewDidLoad或VIEWDIDISPENCE中动态设置一些按钮的位置(尝试了两者),并手动设置尺寸。然后,每当按下按钮时,我都会改变按钮的框架。但即使我设置了原来的一个,它们在屏幕上的位置并不相同,但它们看起来有点“向下移动了一些像素”。我附上代码和证书: 视图显示:IOS-uibutton的动态放置,ios,objective-c,layout,uibutton,Ios,Objective C,Layout,Uibutton,我有一个奇怪的问题: 我正在ViewDidLoad或VIEWDIDISPENCE中动态设置一些按钮的位置(尝试了两者),并手动设置尺寸。然后,每当按下按钮时,我都会改变按钮的框架。但即使我设置了原来的一个,它们在屏幕上的位置并不相同,但它们看起来有点“向下移动了一些像素”。我附上代码和证书: 视图显示: self.twoTeamsBtn = [[UIButton alloc] init]; self.twoTeamsBtn.frame = CGRectMake(156/2, (9
self.twoTeamsBtn = [[UIButton alloc] init];
self.twoTeamsBtn.frame = CGRectMake(156/2, (94/2), selected2Image.size.width, selected2Image.size.height);
self.threeTeamsBtn = [[UIButton alloc] init];
self.threeTeamsBtn.frame = CGRectMake(331/2, (132/2), unselected3Image.size.width, unselected3Image.size.height);
self.fourTeamsBtn = [[UIButton alloc] init];
self.fourTeamsBtn.frame = CGRectMake(505/2, (132/2), unselected4Image.size.width, unselected4Image.size.height);
所以,两支球队的得分是94/2(Y),而E是132/2。两幅图像的高度相同。
(selected2与selected3相同,unselected3与unselected3相同,依此类推)
然后在我的单击方法中,我有:
if (button.tag == self.twoTeamsBtn.tag) {
self.threeTeamsBtn.frame = CGRectMake(331/2, (132/2), self.threeTeamsBtn.frame.size.width, self.threeTeamsBtn.frame.size.height);
self.fourTeamsBtn.frame = CGRectMake(505/2, (132/2), self.fourTeamsBtn.frame.size.width, self.fourTeamsBtn.frame.size.height);
self.twoTeamsBtn.frame = CGRectMake(156/2, (94/2), selected2Image.size.width, selected2Image.size.height);
[self.threeTeamsBtn setImage:unselected3Image forState:UIControlStateNormal];
[self.twoTeamsBtn setImage:selected2Image forState:UIControlStateNormal];
[self.fourTeamsBtn setImage:unselected4Image forState:UIControlStateNormal];
} else if (button.tag == self.threeTeamsBtn.tag) {
self.threeTeamsBtn.frame = CGRectMake(331/2, (94/2), selected3Image.size.width, selected3Image.size.height);
self.fourTeamsBtn.frame = CGRectMake(505/2, (132/2), self.fourTeamsBtn.frame.size.width, self.fourTeamsBtn.frame.size.height);
self.twoTeamsBtn.frame = CGRectMake(156/2, (132/2), self.twoTeamsBtn.frame.size.width, self.twoTeamsBtn.frame.size.height);
[self.threeTeamsBtn setImage:selected3Image forState:UIControlStateNormal];
[self.twoTeamsBtn setImage:unselected2Image forState:UIControlStateNormal];
[self.fourTeamsBtn setImage:unselected4Image forState:UIControlStateNormal];
} else if (button.tag == self.fourTeamsBtn.tag) {
self.threeTeamsBtn.frame = CGRectMake(331/2, (132/2), self.threeTeamsBtn.frame.size.width, self.threeTeamsBtn.frame.size.height);
self.fourTeamsBtn.frame = CGRectMake(505/2, (94/2), selected4Image.size.width, selected4Image.size.height);
self.twoTeamsBtn.frame = CGRectMake(156/2, (132/2), self.twoTeamsBtn.frame.size.width, self.twoTeamsBtn.frame.size.height);
[self.threeTeamsBtn setImage:unselected3Image forState:UIControlStateNormal];
[self.twoTeamsBtn setImage:unselected2Image forState:UIControlStateNormal];
[self.fourTeamsBtn setImage:selected4Image forState:UIControlStateNormal];
}
截图如下:
因此,如果您在第二张图片中看到,按钮2和按钮4不在同一级别,尽管它们的帧相同。在第三种情况下,2和3处于同一级别
例如,它与原来的132/2相似,与后来的那套不同。
我错过什么了吗
btn1 = [[UIButton alloc] init];
btn1.frame = CGRectMake(156/2, (94/2), 50, 50);
btn2 = [[UIButton alloc] init];
btn2.frame = CGRectMake(331/2, (132/2), 50, 50);
btn3 = [[UIButton alloc] init];
btn3.frame = CGRectMake(505/2, (132/2), 50, 50);
[btn1 setBackgroundColor:[UIColor blackColor]];
[btn2 setBackgroundColor:[UIColor redColor]];
[btn3 setBackgroundColor:[UIColor blueColor]];
[btn1 addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
[btn2 addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
[btn3 addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
btn1.tag=1000;
btn2.tag=2000;
btn3.tag=3000;
[self.view addSubview:btn1];
[self.view addSubview:btn2];
[self.view addSubview:btn3];
将此代码放入ViewDidDisplay或ViewDidLoad中。如果您能够,最好避免更改事物的帧,这将起作用。最好是调整
边界
和中心
,然后重新计算帧
在您的特定示例中,使用以下内容设置变换
属性的动画更容易:
// animate upwards
btn.transform = CGAffineTransformMakeTranslation(0, -50)
// go back to where it was
btn.transform = CGAffineTransformIdentity
CGAffineTransformity
转换会自动将按钮放回原来的位置,这使得此解决方案非常简单
如果您也要更改按钮的图像,如果可以,最好是确保前后图片的大小相同,可以在两者中较小的图片上添加少量空白。这样你的按钮就不会改变大小,这意味着你不用担心一件事。我很感激你可能已经找到了答案,多亏了两根稻草,但我认为问题在于你设置框架宽度/高度的方式
if (button.tag == self.twoTeamsBtn.tag) {
self.threeTeamsBtn.frame = CGRectMake(331/2, (132/2), self.threeTeamsBtn.frame.size.width, self.threeTeamsBtn.frame.size.height);
self.fourTeamsBtn.frame = CGRectMake(505/2, (132/2), self.fourTeamsBtn.frame.size.width, self.fourTeamsBtn.frame.size.height);
self.twoTeamsBtn.frame = CGRectMake(156/2, (94/2), selected2Image.size.width, selected2Image.size.height);
[self.threeTeamsBtn setImage:unselected3Image forState:UIControlStateNormal];
[self.twoTeamsBtn setImage:selected2Image forState:UIControlStateNormal];
[self.fourTeamsBtn setImage:unselected4Image forState:UIControlStateNormal];
}
对于未选择的图像,您正在将帧设置为之前的大小,但如果选择/未选择的图像大小不同,则最后一个选择的图像(现在未选择的图像)将处于禁用状态。您需要根据正在使用的图像设置帧大小
i、 e
您似乎只是在移动按钮。为了避免此类问题,您是否考虑过仅使用翻译设置
transform
属性的动画?这样回到原始状态只是使用身份转换的问题。@TwoStraws你能给我举个例子吗?即使我正在移动按钮,我也不明白为什么它们没有回到原来的位置,而且它们似乎处于不同的高度?请尝试以下操作:btn.transform=CGAffineTransformMakeTranslation(0,-50)
然后btn.transform=CGAffineTransformity
将其放回原处。@TwoStraws如果我也想更改图像,该怎么办?你能不能给我一个完整的答案,这样我也可以接受,如果它有效的话?完成了!如果您想更改图像,则可以,但如果可能,请尝试确保它们的大小相同。这与我上面所说的有什么不同?您正在将图像的大小指定给按钮。未选择的4图像和未选择的2图像大小不同。这就是问题所在
if (button.tag == self.twoTeamsBtn.tag) {
self.threeTeamsBtn.frame = CGRectMake(331/2, (132/2), unselected3Image.size.width, unselected3Image.size.height);
self.fourTeamsBtn.frame = CGRectMake(505/2, (132/2), unselected4Image.size.width, unselected4Image.size.height);
self.twoTeamsBtn.frame = CGRectMake(156/2, (94/2), selected2Image.size.width, selected2Image.size.height);
[self.threeTeamsBtn setImage:unselected3Image forState:UIControlStateNormal];
[self.twoTeamsBtn setImage:selected2Image forState:UIControlStateNormal];
[self.fourTeamsBtn setImage:unselected4Image forState:UIControlStateNormal];
}