Xcode 12.2 NSButton 不能正确旋转
NSButton doesn't rotate correctly with Xcode 12.2
我有一个 square
NSButton
设置在故事板中使用自动布局。
按钮设置为Image only
,我使用NSRefreshTemplate
系统图像。
这是我让它旋转的代码
static BOOL _animate = NO;
- (void)animateRefreshButton:(BOOL)animate
{
NSButton *btn = _refreshButton;
[btn setWantsLayer:YES];
// Set the anchor point of the refresh button
CALayer *btnLayer = btn.layer;
NSRect frame = btn.frame;
btnLayer.position = NSMakePoint(NSMidX(frame), NSMidY(frame)); // position to centre of frame
btnLayer.anchorPoint = NSMakePoint(0.5, 0.5); // anchor point to centre - specified in unit coordinates
_animate = animate;
if (animate)
{
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.delegate = self;
animation.fromValue = [NSNumber numberWithFloat:2 * M_PI];
animation.toValue = [NSNumber numberWithFloat:0];
animation.duration = 0.6; // Speed
animation.repeatCount = 1;// INFINITY; // Repeat forever. Can be a finite number.
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
[btn.layer addAnimation:animation forKey:@"refreshbutton.rotation"];
}
}
在我使用 MacOS 11.0
上的新 Xcode 12.2
测试版构建之前,它一直运行良好。现在按钮旋转似乎不是中心。
如果我将按钮 Scaling
设置为 None
,它会很好地居中旋转,但图像太小了。如果我将 Scaling
设置为 Proportionately Up or Down
以便图像填充按钮,它会旋转得很奇怪。
我该如何解决这个问题?
问题
在 Catalina 上它仍然可以使用 Xcode 12 beta。问题似乎是,对于 macOS 11 Big Sur,按钮不再居中对齐。
可以这样测试:
button.image = [NSImage imageNamed:NSImageNameRefreshTemplate];
[button.cell setBackgroundColor:NSColor.redColor];
这在 Catalina 上有所不同,按钮居中对齐。也许这是 Big Sur 中的一个错误,将在即将发布的版本中修复。对于这两种变体,我都使用了 Xcode 12.2 beta 2。因此它与 OS 而不是 Xcode beta 相关。
解决方法
以居中对齐的方式绘制刷新图标并使用您的自定义图标,例如
button.image = [NSImage imageNamed:@"my_refresh_icon"];
然后动画在 Catalina 上和在 mac 上一样好OS Big Sur。
测试
我有一个 square
NSButton
设置在故事板中使用自动布局。
按钮设置为Image only
,我使用NSRefreshTemplate
系统图像。
这是我让它旋转的代码
static BOOL _animate = NO;
- (void)animateRefreshButton:(BOOL)animate
{
NSButton *btn = _refreshButton;
[btn setWantsLayer:YES];
// Set the anchor point of the refresh button
CALayer *btnLayer = btn.layer;
NSRect frame = btn.frame;
btnLayer.position = NSMakePoint(NSMidX(frame), NSMidY(frame)); // position to centre of frame
btnLayer.anchorPoint = NSMakePoint(0.5, 0.5); // anchor point to centre - specified in unit coordinates
_animate = animate;
if (animate)
{
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.delegate = self;
animation.fromValue = [NSNumber numberWithFloat:2 * M_PI];
animation.toValue = [NSNumber numberWithFloat:0];
animation.duration = 0.6; // Speed
animation.repeatCount = 1;// INFINITY; // Repeat forever. Can be a finite number.
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
[btn.layer addAnimation:animation forKey:@"refreshbutton.rotation"];
}
}
在我使用 MacOS 11.0
上的新 Xcode 12.2
测试版构建之前,它一直运行良好。现在按钮旋转似乎不是中心。
如果我将按钮 Scaling
设置为 None
,它会很好地居中旋转,但图像太小了。如果我将 Scaling
设置为 Proportionately Up or Down
以便图像填充按钮,它会旋转得很奇怪。
我该如何解决这个问题?
问题
在 Catalina 上它仍然可以使用 Xcode 12 beta。问题似乎是,对于 macOS 11 Big Sur,按钮不再居中对齐。
可以这样测试:
button.image = [NSImage imageNamed:NSImageNameRefreshTemplate];
[button.cell setBackgroundColor:NSColor.redColor];
这在 Catalina 上有所不同,按钮居中对齐。也许这是 Big Sur 中的一个错误,将在即将发布的版本中修复。对于这两种变体,我都使用了 Xcode 12.2 beta 2。因此它与 OS 而不是 Xcode beta 相关。
解决方法
以居中对齐的方式绘制刷新图标并使用您的自定义图标,例如
button.image = [NSImage imageNamed:@"my_refresh_icon"];
然后动画在 Catalina 上和在 mac 上一样好OS Big Sur。
测试