当用户按下按钮然后为宽度设置动画时,我正在尝试为我的UIButton提供一个新的背景图像。问题是按钮没有缩放图像(我只使用视网膜图像)。
点击之前:
点击后:
让事情发生的代码:
UIImage *buttonProfileDefault = [[UIImage imageNamed:@"Profile_Button_Default"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)];
[self.profileButton setBackgroundImage:buttonProfileDefault forState:UIControlStateNormal];
[self.profileButton removeConstraint:self.profileButtonConstraint];
// Animate
CGRect originalFrame = self.profileButton.frame;
originalFrame.size.width = 40;
[UIView animateWithDuration:0.2f
animations:^{
self.profileButton.frame = originalFrame;
}
completion:^(BOOL finished) {
}];
答案 0 :(得分:3)
试试这段代码......
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.0];
[self.profileButton setBackgroundImage:[UIImage imageNamed:@"Profile_Button_Default"] forState:UIControlStateNormal];
[self.profileButton setBackgroundImage:[UIImage imageNamed:@"Profile_Button_Default"] forState:UIControlStateSelected];
[self.profileButton setFrame:CGRectMake(self.profileButton.frame.origin.x, self.profileButton.frame.origin.y, self.profileButton.frame.size.width + 40, self.profileButton.frame.size.height)];
[UIView commitAnimations];
我希望这可以帮助你...
答案 1 :(得分:2)
创建边缘插入的方式,将使最左边的3个和最右边的3个(或像素)保持不变,并且它会拉伸按钮上的头部。如果你想让头部的大小保持不变,你必须将它包含在左侧,留下1个像素可拉伸,然后是右侧。假设你的图片宽度为50,你会写:
UIImage * buttonProfileDefault = [[UIImage imageNamed:@"Profile_Button_Default"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 46, 3, 3)];
然而,这会使您的照片位于按钮的左侧。我建议的解决方案是使用2张图片:
代码看起来像:
UIImage *backgroundImage = [[UIImage imageNamed:@"border.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)]; // in this case you can use 3, 3, 3, 3
[self.profileButton setBackgroundImage:backgroundImage forState:UIControlStateNormal];
UIImage *titleImage = [UIImage imageNamed:@"head.png"];
[self.profileButton setImage:titleImage forState:UIControlStateNormal];
希望这有帮助!
答案 2 :(得分:2)
我已在以下几点修改了您的代码:
现在检查:
UIImage *buttonProfileDefault = [[UIImage imageNamed:@"Profile_Button_Default.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)];
[self.profileButton setBackgroundImage:buttonProfileDefault forState:UIControlStateNormal];
[self.profileButton setBackgroundImage:buttonProfileDefault
forState:UIControlStateSelected];
[self.profileButton setBackgroundImage:buttonProfileDefault forState:UIControlStateHighlighted];
[self.profileButton removeConstraint:self.profileButtonConstraint];
// Animate
CGRect originalFrame = self.profileButton.frame;
originalFrame.size.width = 40;
[UIView animateWithDuration:0.2f
animations:^{
self.profileButton.frame = originalFrame;
}
completion:^(BOOL finished) {
}];
答案 3 :(得分:2)
我认为问题在于你改变背景然后调整大小。
使其使用自动布局的关键是为widthConstraint常量值设置动画,并在动画中设置背景图像。
例如,我的视图名称按钮上有一个按钮,我有一个名为 buttonWidth 的宽度约束的IBOutlet - 下面是我的buttonPress的代码 :
UIImage *imageButton = [[UIImage imageNamed:@"button"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10)];
[UIView animateWithDuration:0.01f
animations:^{
[self.button setBackgroundImage:imageButton forState:UIControlStateNormal];
}
completion:^(BOOL finished) {
[UIView animateWithDuration:1.0f
animations:^{
self.buttonWidth.constant = 300;
[self.view layoutIfNeeded];
}
completion:^(BOOL finished) {
}];
}];
正如您在上面的代码中看到的那样,使其适用于我的关键是在动画中设置按钮背景,由于某种原因,如果我在动画外部更改了背景图像,它将无法正确设置,直到动画完成。
使用autoLayout时设置框架对我来说不起作用,所以我给约束常量设置了动画
答案 4 :(得分:2)
尝试此操作,而不是将图像指定为
UIImage *buttonProfileDefault = [[UIImage imageNamed:@"Profile_Button_Default"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)];
这样做
UIImage *buttonProfileDefault = [UIImage imageNamed:@"Profile_Button_Default"];
无需设置resizableImageWithCapInsets的约束。
答案 5 :(得分:1)
我遇到了同样的问题,但是当我的应用加载时发生了这种情况,我在检查器中查看了button
的属性,如果向下滚动并取消选中autoresize subviews
它可能会工作,它为我做了!祝你好运!
答案 6 :(得分:1)
在使用笔尖时,我有类似的情况调整子视图的大小。不确定你是不是,但解决我的问题的是在我的各种观点中取消选中“使用Autolayout”。
希望能解决您的问题。
布兰登
答案 7 :(得分:1)