gpt4 book ai didi

ios - 为什么 UILabel 边界上的动画仅在增加大小时才起作用?

转载 作者:IT王子 更新时间:2023-10-29 08:03:36 24 4
gpt4 key购买 nike

我注意到,当我在动画 block 中更改 UILabel 的边界时,它只有在我增加尺寸时才有效,当我减小尺寸时,UILabel 只会改变其尺寸但不会设置动画。用普通 UIView 替换 UILabel 可以按预期工作。

注意:将 UILabel 的 contentMode 属性更改为 UIViewContentModeScaleToFill 可以解决此问题,但我仍然不明白为什么在不更改 contentMode 属性的情况下增加大小时它会起作用。

#import "FooView.h"

@interface FooView ()
@property (strong, nonatomic) UILabel *label;
@property (assign, nonatomic) BOOL resized;
@end

@implementation FooView

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor lightGrayColor];

self.label = [[UILabel alloc] initWithFrame:(CGRect){0, 0, frame.size}];
self.label.backgroundColor = [UIColor greenColor];
[self addSubview:self.label];
_resized = false;

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changeSize)];
tapRecognizer.numberOfTapsRequired = 1;
[self addGestureRecognizer:tapRecognizer];
}
return self;
}

- (void)changeSize {
[UIView animateWithDuration:0.8
delay:0.0
options:UIViewAnimationOptionCurveEaseIn
animations:^{
CGRect bounds = self.label.bounds;
if (self.resized) {
bounds.size.height *= 2;
bounds.size.width *= 2;
} else {
bounds.size.width /= 2;
bounds.size.height /= 2;
}
self.label.bounds = bounds;
}
completion:^(BOOL finished) {
self.resized = !self.resized;
}];
}

@end

最佳答案

这是因为 UILabel 将其图层的 contentsGravity 设置为文本呈现的方向,这恰好默认为 UIViewContentModeLeft(或 @“左”)。因此,当图层被告知要设置动画时,它首先会看一眼其内容的引力,并以此为基础制作后续动画。因为它看到 @"left" 应该是 @"resize",所以它假设缩放动画应该从左边开始,但它也必须遵守约束你已经给了它(边界发生变化),所以你的标签看起来会跳到它的最终大小然后在屏幕中央的位置安顿下来。

如果您想单独保留 contentMode,请使用 CATransform3D 并以这种方式缩放标签的图层,而不是更改边界。

关于ios - 为什么 UILabel 边界上的动画仅在增加大小时才起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17360402/

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