gpt4 book ai didi

macos - CGAffineTransformMakeScale 不工作 - OS X - Cocoa

转载 作者:行者123 更新时间:2023-12-03 17:31:25 25 4
gpt4 key购买 nike

我正在开发一个简单的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com