- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个简单的 Mac 应用程序。我希望能够对 NSButton 应用变换并使其更大。其大小的两倍。但是我的代码不起作用,它只是将按钮滑到角落。有谁知道出了什么问题吗?
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
[numberButton1.animator.layer setAffineTransform:CGAffineTransformMakeScale(4.0, 4.0)];
numberButton1.layer.anchorPoint = CGPointMake(0.5, 0.5);
[numberButton1.animator.layer setAffineTransform:CGAffineTransformMakeScale(1.0, 1.0)];
} completionHandler:nil];
更新1
我尝试了以下方法,但没有任何作用:(
CGAffineTransform test = CGAffineTransformMakeScale(4.0, 4.0);
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *ctx) {
numberButton1.animator.layer.affineTransform = test;
} completionHandler:^{
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *ctx) {
numberButton1.animator.layer.affineTransform = CGAffineTransformIdentity;
} completionHandler:^{
NSLog(@"Done...");
}];
}];
更新2
这是我的代码 sudo,希望这会有所帮助:
我的头文件(.h):
#import <Cocoa/Cocoa.h>
#import <QuartzCore/QuartzCore.h>
@interface ViewController : NSViewController {
IBOutlet NSButton *numberButton1;
}
-(IBAction)demo:(id)sender;
@end
我的实现 (.m) 文件:
#import "ViewController.h"
@implementation ViewController
-(IBAction)demo:(id)sender {
CGRect frame = numberButton1.layer.frame;
CGPoint center = CGPointMake(CGRectGetMidX(frame), CGRectGetMidY(frame));
numberButton1.layer.position = center;
numberButton1.layer.anchorPoint = CGPointMake(0.5, 0.5);
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
context.allowsImplicitAnimation = YES;
[[NSAnimationContext currentContext] setDuration:0.2];
numberButton1.animator.layer.affineTransform = CGAffineTransformMakeScale(4.0, 4.0);
} completionHandler:^{
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
context.allowsImplicitAnimation = YES;
[[NSAnimationContext currentContext] setDuration:0.2];
numberButton1.animator.layer.affineTransform = CGAffineTransformIdentity;
} completionHandler:nil];
}];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
numberButton1.wantsLayer = YES;
numberButton1.layerContentsRedrawPolicy = NSViewLayerContentsRedrawOnSetNeedsDisplay;
numberButton1.layer.backgroundColor = [NSColor colorWithRed:(17/255.0) green:(145/255.0) blue:(44/255.0) alpha:1.0].CGColor;
}
- (void)setRepresentedObject:(id)representedObject {
[super setRepresentedObject:representedObject];
// Update the view, if already loaded.
}
@end
我也没有为我的 UI 文件使用自动布局
。
谢谢,丹。
最佳答案
CALayer
上的affineTransform
属性只是transform
属性的便捷包装。在图层支持的 View 上,您不应该更改此设置。话虽如此,这是可能的。
您的第一个问题是您无法使用 NSAnimation
block 对图层属性进行动画处理。您需要显式创建一个表示变换动画的 CABasicAnimation 对象并将其添加到图层中。 编辑:我刚刚记得实际上可以对图层属性进行动画处理。您需要在上下文上启用 allowsImplicitAnimation
属性。此属性的预期目的是让您在不使用动画代理代理的情况下对 View 属性进行动画处理,但副作用是它允许您对隐式图层属性进行动画处理。
第二个问题,正如之前简要提到的,是如果您的 View 是受图层支持的,则无法在 View 图层上安全地设置变换/ anchor 。每当几何图形发生变化时,NSView
都会重置图层的变换和 anchor 。如果 View 是图层托管的,您可以修改这些属性,但这会带来您最可能想要避免的一大堆问题。有一些hacks您可以使用它们来避免此问题,但它们需要调配,并且对于您不拥有的任何 View (例如 NSButton
)可能应该避免。
所以我要问,为什么要将按钮设置为原来的两倍呢?缩放状态是短暂的还是持久的?如果它持续存在,请更改框架。否则,如果它是 transient 的并且 View 的几何形状没有改变,您可能可以不必修改这两个属性,因为 AppKit 没有理由在您完成动画之前重置它们。
<小时/>编辑:您看不到动画的原因是您的原始代码在同一事务中应用了两次缩放变换。当此事务合并修改时,它将选择最后应用的变换,这意味着它将是恒等变换,顺便说一下,应该将其写为 CGAffineTransformIdentity ,而不是带有因子为 1。通过将另一个动画 block 放入第一个动画的完成 block 中,在新事务中应用缩小动画。例如:
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *ctx) {
ctx.allowsImplicitAnimation = YES;
layer.affineTransform = transform;
} completionHandler:^{
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *ctx) {
ctx.allowsImplicitAnimation = YES;
layer.affineTransform = CGAffineTransformIdentity;
} completionHandler:nil];
}];
在尝试动画之前,请确保要缩放的 subview 的父 View 是受图层支持的 (wantsLayer = YES
)。
关于macos - CGAffineTransformMakeScale 不工作 - OS X - Cocoa,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29429712/
我知道使图像变大的代码是: imageView.transform = CGAffineTransformMakeScale(5f, 5f); 但是我可以添加什么来使效果需要几秒钟呢? 预期的效果是让
如何在 Cocoa 中使用 CGAffineTransformMakeScale?在 iPhone 上我确实喜欢这样: something.transform = CGAffineTransformM
我有一个正在通过 UIPinchGesture 缩小的 View 。该 View 的 subview 是带有关联图像的 UIImageView。问题是当缩小到原来较大尺寸的 1/4 左右时,缩小似乎会
我的代码用于平移和缩放用于工作的按钮。Xcode 现在以某种方式抛出警告:Implicit declaration of function 'CGAffineTransformMakeScale' i
我正面临这个奇怪的问题,其中 CGAffineTransformMakeScale 导致旋转。顾名思义,它应该只会导致缩放,但事实并非如此。 [UIView animateWithDuration:1
我有一个使用 Storyboard布局的 UIButton。该按钮只包含一个图像。单击按钮时,我想为按钮的大小设置动画 - 减小大小,然后再次将其恢复到原始大小。 我使用了以下代码 - [UIView
我有一个 View Controller ,我正在使用 UIView 动画将其缩小到 0,然后再删除它。我的解散代码是: [UIView animateWithDuration:_dismissAni
我想制作一个UIView动画,以便其右侧变小然后再返回。点击此UIView中的UIButton时将触发此动画。这是我想要的一个快速模型-UIView将从状态1>状态2>状态1进入: 好像它被推向一侧。
我有一个 UITextView 实例。它实际上是一个盒子,当用户点击它时,我想让它变大。所以我在点击事件中实现了 CGAffineTransformMakeScale。 问题是,UITextView
我有一个问题。有一个uiview,它是通过手势控制的(可以水平移动)。虽然这个 uiview 很小,但一切都很好。 在使用 CGAffineTransformScale 缩放它之后,奇怪的事情开始了:
我有点困惑。假设我有一个名为 myView 的 UIView,我们有以下代码块: [myView setTransform:CGAffineTransformMakeScale(2.0f, 2.0f)
为什么上面只有一个在代码中有效? 目前我正在使用以下... image.transform = CGAffineTransformMakeRotation(M_PI/2.5); image.trans
我有多个 View , View 上有许多 UILabel。 (全部在 Interface Builder 中构建)。 然后,当您捏合屏幕时,我会尝试创建一个“更小”的 View 副本。 为此,我申请
((UIImageView*)[dsry objectAtIndex:0]).transform = CGAffineTransformMakeRotation(1.57*2); ((UIImageV
使用以下方法翻转 View : self.transform = CGAffineTransformMakeScale(-1, 1); // self is an UIView 要旋转此 View
我正在使用最新的 SDK 开发 iOS 应用程序。 我这样创建一个AVCaptureVideoPreviewLayer: // Create the preview layer _videoPrevi
我在处理动画时遇到问题。 image View 从比例 1 开始。我想缩小它。代码看起来很简单: image.transform = CGAffineTransformIdentity // Voi
我正在开发一个简单的 Mac 应用程序。我希望能够对 NSButton 应用变换并使其更大。其大小的两倍。但是我的代码不起作用,它只是将按钮滑到角落。有谁知道出了什么问题吗? [NSAnimation
这应该是一个简单的问题 - 当我在 UIView 上使用 CGAffineTransformMakeScale 时,width = 0.5 和 height = 0.5,它缩小到左上角。我需要它围绕其
float scaleFactor = 0.5; self.bubble.transform = CGAffineTransformMakeScale(scaleFactor, scaleFa
我是一名优秀的程序员,十分优秀!