2015-12-19 48 views
2

的动态位置我有一个奇怪的问题:IOS - 的UIButton

我动态设置在任何viewDidLoad中或ViewDidAppear一些按钮的位置(想他们两者)和手动设置尺寸。然后,无论何时按下按钮,我都会更改按钮的框架。但即使当我设置了原来的一个 - 他们不在屏幕上的相同位置,但他们看起来有点“移动了一些PX”。在2分之132

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); 

所以,twoTeams是二分之九十四(Y)和你,我附上代码和sceenshot:

viewDidAppear。两幅图像的高度相同。 (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]; 

} 

截图如下:

button 2 selected button 3 selected button 3 selected

所以,如果你在第二个图片中看到,按钮2和按钮4不在同一层,尽管它们的帧是相同的。在第三个中,第二个和第三个在同一个水平上。

这就像原来的132/2例如,不像以后的设置一样。

我错过了什么吗?

+0

你似乎只是移动的按钮。为了避免这种问题,你有没有考虑过用翻译动画变换属性?这样回到原始状态只是使用身份变换的问题。 – TwoStraws

+0

@TwoStraws你能举个例子吗?即使我在移动按钮,我也不明白为什么他们不能回到原来的位置,而且他们似乎处于不同的高度? – ghostrider

+1

试试这个:'btn.transform = CGAffineTransformMakeTranslation(0,-50)'然后'btn.transform = CGAffineTransformIdentity'把它放回去。 – TwoStraws

回答

2

我明白,你可能已经找到了答案感谢TwoStraws,但我认为这个问题是到要设置边框的宽度的方式/高度

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]; 
} 

正在设置未选择图像该框架与以前相同,但如果选定/未选择的图像大小不同,则选择的最后一个(现在未选中的图像将关闭)。您需要根据您使用的图像设置帧大小。

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]; 
} 
-1
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]; 

将此代码放在ViewDidAppear或ViewDidLoad中。它将起作用

+0

这与我上面所说的有什么不同? – ghostrider

+0

您正在将图像的大小分配给按钮。您未选择的图像和未选择的图像大小不同。那就是问题所在 –

1

如果您能够更改框架的东西,最好避免 - 最好调整boundscenter,然后再重新为您计算frame

在你的具体的例子,动画的transform属性是更容易,使用这样的事情:

// animate upwards 
btn.transform = CGAffineTransformMakeTranslation(0, -50) 

// go back to where it was 
btn.transform = CGAffineTransformIdentity 

CGAffineTransformIdentity自动变换放按钮回到它在哪里,这是什么使这个解决方案很容易。

如果您还在更改按钮图像,如果可以,最好的方法是确保您的照片前后的图片尺寸相同,也许可以通过向两个较小的图片添加少量的空白。这样你的按钮就不会变化,这意味着你有一件事不必担心。