- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试编写一个自定义 UIButton
子类,它将在按下和释放期间“动画化”。
按下时,按钮应“收缩”(向其中心)至其原始大小的 90%。释放时,按钮应“扩展”到 105%,再次收缩到 95%,然后恢复到原来的大小。
这是我现在得到的代码:
#pragma mark -
#pragma mark - Touch Handling
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
[self animatePressedDown];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesCancelled:touches withEvent:event];
[self animateReleased];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesEnded:touches withEvent:event];
[self animateReleased];
}
- (void)animatePressedDown {
NSLog(@"button.frame before animatedPressedDown: %@", NSStringFromCGRect(self.frame));
[self addShadowLayer];
CATransform3D ninetyPercent = CATransform3DMakeScale(0.90f, 0.90f, 1.00f);
[UIView animateWithDuration:0.2f
animations:^{
self.layer.transform = ninetyPercent;
}
completion:^(BOOL finished) {
NSLog(@"button.frame after animatedPressedDown: %@", NSStringFromCGRect(self.frame));
}
];
}
- (void)animateReleased {
[self.shadowLayer removeFromSuperlayer];
CATransform3D oneHundredFivePercent = CATransform3DMakeScale(1.05f, 1.05f, 1.00f);
CATransform3D ninetyFivePercent = CATransform3DMakeScale(0.95f, 0.95f, 1.00f);
[UIView animateWithDuration:0.1f
animations:^{
self.layer.transform = oneHundredFivePercent;
}
completion:^(BOOL finished) {
NSLog(@"button.frame after animateReleased (Stage 1): %@", NSStringFromCGRect(self.frame));
[UIView animateWithDuration:0.1f
animations:^{
self.layer.transform = ninetyFivePercent;
}
completion:^(BOOL finished) {
NSLog(@"button.frame after animateReleased (Stage 2): %@", NSStringFromCGRect(self.frame));
[UIView animateWithDuration:0.1f
animations:^{
self.layer.transform = CATransform3DIdentity;
self.layer.frame = self.frame;
}
completion:^(BOOL finished) {
NSLog(@"button.frame after animateReleased (Stage 3): %@", NSStringFromCGRect(self.frame));
}
];
}
];
}
];
}
无论如何,上面的代码工作得很好……有些时候。在其他时候,按钮动画按预期工作,但在“释放”动画之后,按钮的最后一帧从其原始位置向上和向左“移动”。这就是为什么我有那些 NSLog
语句,以准确跟踪按钮的框架在动画的每个阶段的位置。当“转变”发生时,它发生在 animatePressedDown
和 animateReleased
之间的某处。至少,animatePressedDown
中显示的框架始终是我所期望的,但是animateReleased
中框架的第一个值经常是错误的.
虽然我的应用程序中的相同按钮在不同应用程序运行期间表现一致,但我看不出这种疯狂的模式。
我对我的所有按钮都使用了自动布局,所以我无法弄清楚使一个按钮正确运行而另一个按钮改变其位置的区别是什么。
最佳答案
我真的很讨厌自己回答问题,但我想通了。
(我已经为这个问题苦苦挣扎了好几天,但在我问了这个问题之后它终于解决了。它不是总是这样吗?)
显然,我遇到的问题是(在“正在移动的”按钮上)我在动画中间更改了按钮的标题。
一旦我设置了一个基于 block 的系统来仅在按钮的“反弹”/“弹出”动画完成后调用标题更改,问题就消失了。
我仍然不知道为什么会这样工作,因为我设置的标题不会改变按钮的整体大小,但是按照描述设置按钮解决了我的问题。
这是我的自定义 UIButton
子类的代码,添加了 block 属性:
@interface MSSButton : UIButton {
}
@property (copy , nonatomic) void(^pressedCompletion)(void);
// Other, non-related stuff...
@end
@implementation MSSButton
#pragma mark -
#pragma mark - Touch Handling
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
[self animatePressedDown];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesCancelled:touches withEvent:event];
[self animateReleased];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesEnded:touches withEvent:event];
[self animateReleased];
}
- (void)animatePressedDown {
[self addShadowLayer];
CATransform3D ninetyPercent = CATransform3DMakeScale(0.90f, 0.90f, 1.00f);
[UIView animateWithDuration:0.2f
animations:^{
self.layer.transform = ninetyPercent;
}
];
}
- (void)animateReleased {
[self.shadowLayer removeFromSuperlayer];
CATransform3D oneHundredFivePercent = CATransform3DMakeScale(1.05f, 1.05f, 1.00f);
CATransform3D ninetyFivePercent = CATransform3DMakeScale(0.95f, 0.95f, 1.00f);
[UIView animateWithDuration:0.1f
animations:^{
self.layer.transform = oneHundredFivePercent;
}
completion:^(BOOL finished) {
[UIView animateWithDuration:0.1f
animations:^{
self.layer.transform = ninetyFivePercent;
}
completion:^(BOOL finished) {
[UIView animateWithDuration:0.1f
animations:^{
self.layer.transform = CATransform3DIdentity;
}
completion:^(BOOL finished) {
if (self.pressedCompletion != nil) {
self.pressedCompletion();
self.pressedCompletion = nil;
}
}
];
}
];
}
];
}
@end
由于我的 IBAction
在 animateReleased
之前触发(由于我的触摸处理方法中列出的方法顺序),我只需设置 pressedCompletion
block 在我的 IBAction
中,标题在动画序列结束时更改。
关于ios - UIButton 按下/释放动画奇怪地不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25329094/
标题看起来很长,但我想做的事情很简单。 我有几个相同的按钮排成一排,并将它们的标签设置为 0...n。单击其中任何一个(例如第二个)都会弹出一个弹出 View ,其中有几个代表不同选项的按钮(A、B、
我正在尝试添加动画以在点击按钮时淡出按钮。我现在使用的代码只是等待几秒钟,然后几乎立即淡出按钮。我想知道如何在点击按钮后立即开始淡出按钮并使淡入淡出持续大约一秒钟? 这是我目前使用的代码: UIVie
我正在尝试将属性字符串设置为按钮。 这个函数在swift上的定义是这样的 func setAttributedTitle(_ title: NSAttributedString!,
我的 UI 上有多个按钮,我想根据不同类型的点击执行不同的功能, 单击 双击 长按 对我来说,单击一下很容易,一个连接了所有四个按钮的 IBAction,但对于其他类型的点击,我被卡住了, 我知道我需
我测试了大量样本,但没有一个对我有用。这是我的代码: override func viewDidLoad() { super.viewDidLoad() let button = UI
我正在创建一个这样的按钮: let authorizationButton = UIButton() let authorizationButtonHeight = 50.0 let
我不久前才开始编码,所以对于任何明显的错误提前道歉。 我使用 Storyboard创建了两个按钮。我知道您可以像 this solution 一样更改发件人按钮的标题声明了,但我仍然不确定如何在单击第
想象一下用于 Apple TV 的维基百科之类的应用程序,其中包含一段文本,其中包含有关给定主题的信息。文本中的某些单词或短语可能是您可以阅读的其他可用主题。因此,您需要将这些单词/短语制作成可聚焦和
我正在调整一些视觉变化,并注意到当我尝试设置 UIButton 的背景颜色时,它仅设置实际按钮外部的颜色(而不是按钮本身内部的颜色) UIButton* button = [UIButton butt
这里有一个问题要问你: 我有一个 UIButton,我们将其称为 bottomButton。我有另一个 UIButton,我们将其称为 topButton。我想要做的是将 topButton 放在 b
我观察到以下情况: 通过设置 UIButton 的标题颜色就外观而言,UIMenuItems在 UIMenuController的UITextView得到相同的颜色。 applicationDidFi
应用程序从 API 产品选项加载,例如电子商务应用程序的颜色和尺寸。现在,我有点陷入代码困境。 如果选择了一个按钮,让我们说出它的颜色,则应取消选择另一个按钮,因为一次只能选择一种颜色。请看一下下面的
我想从左向右滑入一个 UIButton(屏幕截图中的灰色)并将其置于屏幕中央。虽然已经有一个 UIButton(屏幕截图中的橙色)居中,但应将此按钮推到右侧,并且始终与滑入的 UIButton 保持
如何在 UIButton 之上添加 UIButton? 这样一来,如果我移动父 UIButton,顶部的 UIButton 也会移动。 最佳答案 UIButton *testButton = [UIB
.因此,它将通过使用数组和 random() 触摸 UIButton 与 IBAction 来显示按钮上随机 1-6 个骰子图像的图像,以从图像数组中选择以在图像背景上显示 #import "View
我正在尝试以编程方式创建一个 UIButton。我有一个名为“addCash”的按钮(已在界面生成器中创建),点击此按钮后我希望另一个按钮动态出现。当在 viewDidLoad 中完成时,此按钮工作正
我有一个 UIButton 对象,它的标题是在运行时确定的。标题可能是多行的,所以我想增加 UIButton 对象的高度以匹配其标题标签的高度。我不想创建一个 UIButton 子类,因为我读到这不是
在 Storyboard上我有两个 UIButton。在我的 UIViewController 子类中,我有一个用于此按钮的 IBAction 方法。其中一个按钮有图像但没有标题,另一个按钮有标题但没
我想要一个背面有另一个按钮的按钮。当您按下按钮时,它应该水平翻转并显示另一个按钮。 Apple 在 ipod-App 中做到了这一点。当您听到一首歌曲时,您可以按下导航栏右侧的按钮,然后 View 会
我有一个自定义字段,允许用户在 UITextField 中输入文本。 UITextField 的左侧是一个 UIButton。像这样的东西: 输入您的姓名:[姓名输入栏] 在关于 UIButton 中
我是一名优秀的程序员,十分优秀!