1

我有一个 UIView,当用户点击它时,我想自动缩放到屏幕的大小。

我从http://cocoawithlove.com/2010/09/zoomingviewcontroller-to-animate-uiview.html获取代码

并且缩放有效,除了在缩放开始之前视图旋转 90 度。为什么会这样?

(视图在轮播中。在用户点击视图之前,设备被旋转到横向,此时轮播的视图控制器被推送到导航堆栈并显示轮播。)

代码是:

- (void)buttonTapped:(UIButton *) sender
{
    NSInteger index = [self.carousel indexOfItemView:sender];

    UIView *currentView = [self.carousel itemViewAtIndex: index];
    UIView *proxyView = [[UIView alloc] initWithFrame:currentView.frame];
    proxyView.hidden = YES;
    proxyView.autoresizingMask = currentView.autoresizingMask;
    [currentView.superview addSubview: proxyView];

    CGRect frame = [currentView.window convertRect:currentView.frame fromView:proxyView.superview];
    [currentView.window addSubview:currentView];
    currentView.frame = frame;

    [UIView
     animateWithDuration:2.4
     animations:^{
         currentView.frame = currentView.window.bounds;
     }];

(carousel 是 UIView 派生的对象,来自https://github.com/nicklockwood/iCarousel

谢谢

4

1 回答 1

0

我怀疑问题是:

currentView.frame = frame;

或者:

currentView.frame = currentView.window.bounds;

在横向模式下,您的视图或其中一个封闭视图具有将所有内容旋转 90° 的变换。正如UIView 文档所指出的那样,如果视图的属性不是身份转换,则该frame属性是未定义的。transform可能是设置您的视图frame隐式地将其设置transform回身份,这会导致它旋转回纵向。

上面链接中的文档都警告不要在发生转换frame时进行更改,并提供解决方案:

对此属性的更改可以设置动画。但是,如果 transform 属性包含非恒等变换,则 frame 属性的值是未定义的,不应修改。在这种情况下,您可以使用 center 属性重新定位视图并使用 bounds 属性调整大小。

于 2012-05-30T14:50:31.680 回答