gpt4 book ai didi

iphone - 具有方向和动画的自定义 UIView layoutSubviews?

转载 作者:行者123 更新时间:2023-12-01 16:51:16 25 4
gpt4 key购买 nike

我处于两难境地,使用哪种方法来设置自定义 UIViews 的框架,其中包含许多 subview ,并且仍然有动画并自动调整到旋转。当我创建一个新的 View Controller 时,我通常会在 loadView 或 viewDidLoad 中分配我的自定义 View ,例如:

-(void)viewDidLoad
{
[super viewDidLoad];
detailView = [[DetailView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
detailView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
self.view = detailView;
}

通常这个宽度和高度对于 iPhone5 屏幕是不正确的(实际的 View 框架直到 viewWillAppear 才设置)但由于 autoresizingmask 一切都解决了。

然后在自定义 UIView DetailView 的 initWithFrame 中,我用 CGRectZero 分配所有 subview ,例如:
-(id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
label = [[UILabel alloc] initWithFrame:CGRectZero];
[self addSubview:label];
}
}

然后我覆盖 layoutsubviews 来设置所有 subview 的所有框架。这适用于任何屏幕尺寸和任何方向,例如:
-(void)layoutSubviews
{
[super layoutSubviews];
label.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
}

但是,我刚刚发现layoutSubviews在使用动画时并不是那么好,因为当您在animationblock中使用动画时,layoutsubviews在动画中间被调用并且它完全破坏了动画,例如:
-(void)animateLabel
{
[UIView animateWithDuration:0.4f animations:^
{
label.transform = CGAffineTransformMakeTranslation(100, 100);
}];
}

我相信通过为每个动画使用标志和在 layoutsubviews 中使用这些标志来设置动画 block 的正确开始或结束帧有一些丑陋的解决方法,但我认为我不应该为我想要的每个动画创建一个标志做.

所以我现在的问题是:我应该如何拥有一个带有动画的自定义 UIView,它也会自动调整自身以适应旋转?

我现在能想出的唯一解决方案(我不喜欢):
不要使用 layoutSubviews 而是使用自定义 UIView 的 setFrame/setBounds 方法来设置所有 subview 的框架。然后在每次发生旋转时检查viewController,然后使用自定义UIView的setFrame/setBounds方法更改所有 subview 的所有帧。我不喜欢这个解决方案,因为 iOS5 和 iOS6 中的旋转方法不同,我不想在每个 UIViewController 中使用它自己的自定义 UIView 来执行此操作。

有什么建议么?

最佳答案

我最近开始覆盖 viewDidLayoutSubviews (很多次而不是 viewWillAppear )在我的 UIViewControllers .

viewDidLayoutSubviews被称为旋转。 (来自评论)

该方法在所有内部布局已经完成后触发,因此应该设置所有最终帧,但仍然给您时间在 View 可见之前进行调整,并且动画不应该有任何问题,因为您不是已经在动画 block 内。

View Controller .m

- (void)viewDidLayoutSubViews {
// At this point I know if an animation is appropriate or not.
if (self.shouldRunAnimation)
[self.fuView runPrettyAnimations];
}

fuView.m
- (void)runPrettyAnimations {
// My animation blocks for whatever layout I'd like.
}

- (void)layoutSubviews {
// My animations are not here, but non animated layout changes are.
// - Here we have no idea if our view is visible to the user or may appear/disappear
// partway through an animation.
// - This also might get called far more than we intend since it gets called on
// any frame updates.
}

关于iphone - 具有方向和动画的自定义 UIView layoutSubviews?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15611008/

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