[英]iOS - animating UIView on iPad, change x origin and width simultaneously?
我在iPad上使用UIView動畫遇到了一些麻煩。
我正在開發一個項目,我在其中使用JTRevealSidebar框架在左側實現了“facebook style”菜單。
然而,這個框架完美地運行,而不是將右側視圖“推”出屏幕,我想調整它的大小,因此用戶仍然可以看到右側視圖的整個內容。
我設法通過更改視圖的框架以及執行偏移來實現此目的。
這是側邊欄打開時的樣子:
當它關閉時:
這個右側視圖包含一個帶有兩個按鈕的導航欄(左側有一個按鈕可切換左側邊欄,右側有另一個按鈕可以關閉控制器),內容本身就是一個簡單的UIWebView。
我面臨的問題是在動畫期間(從全屏狀態到側邊欄打開狀態):
當我更改視圖的幀時,即使在執行轉換后,視圖也會在動畫開始之前調整大小,這會產生如下奇怪的效果:
我想保持webview的右側固定在屏幕的右側,並且在動畫時只有左側更改位置(基本上使“完成”按鈕始終處於相同位置)。
這是動畫代碼:
- (void)revealSidebar:(BOOL)shouldReveal {
if (shouldReveal) {
[UIView beginAnimations:@"" context:nil];
[UIView setAnimationDuration:0.3];
// Push the view to the right
contentView.transform = CGAffineTransformTranslate(contentView.transform, CGRectGetWidth(sidebarView.frame), 0);
// Resize the view so it fits on remaining part of the screen
contentView.frame = CGRectMake(contentView.frame.origin.x, contentView.frame.origin.y, contentView.frame.size.width-sidebarView.frame.size.width, contentView.frame.size.height);
// The problem is here: the view's frame is changed before the
// Translate transformation actualy starts...
//
// Is there a way to change the x origin and the width simultaneously ?
[UIView commitAnimations];
} else {
[UIView beginAnimations:@"" context:nil];
[UIView setAnimationDuration:0.3];
// Reset the frame so that it takes up whole screen
contentView.frame = CGRectMake(contentView.bounds.origin.x,contentView.bounds.origin.y,contentView.frame.size.width+sidebarView.frame.size.width,contentView.frame.size.height);
[UIView commitAnimations];
}
_state.isShowing = shouldReveal ? 1 : 0;
}
到目前為止,我沒有運氣,如果有人對如何實現這一目標有任何想法,我就會徘徊。
謝謝
編輯2:
似乎子視圖正在立即調整使用的二重奏翻譯。 所以也許你可以動畫向右移動,然后在完成后設置寬度:
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
contentView.frame = CGRectMake(CGRectGetWidth(sidebarView.frame), 0, contentView.frame.size.width-CGRectGetWidth(sidebarView.frame), contentView.frame.size.height);
}
- (void)animationDidStopBack:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
contentView.frame = contentView.bounds;
}
- (void)revealSidebar:(BOOL)shouldReveal {
if (shouldReveal) {
[UIView beginAnimations:@"" context:nil];
[UIView setAnimationDuration:0.1];
[UIView setAnimationDelegate:self];
contentView.frame = CGRectOffset(contentView.bounds, CGRectGetWidth(sidebarView.frame), 0);
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
[UIView commitAnimations];
} else {
[UIView beginAnimations:@"" context:nil];
[UIView setAnimationDuration:0.3];
[UIView setAnimationDelegate:self];
contentView.frame = CGRectMake(0, 0, contentView.frame.size.width+CGRectGetWidth(sidebarView.frame), contentView.frame.size.height);
[UIView setAnimationDidStopSelector:@selector(animationDidStopBack:finished:context:)];
[UIView commitAnimations];
}
_state.isShowing = shouldReveal ? 1 : 0;
}
它並不完美,但確實避開了右側的空白區域,因此我感覺看起來更好。 特別是如果你加快動畫。
編輯1:
嘗試:
[UIView beginAnimations:@"" context:nil];
[UIView setAnimationDuration:0.3];
if (shouldReveal) {
contentView.frame = CGRectMake(CGRectGetWidth(sidebarView.frame), 0, contentView.frame.size.width-CGRectGetWidth(sidebarView.frame), contentView.frame.size.height);
} else {
contentView.frame = CGRectMake(0, 0, contentView.frame.size.width+CGRectGetWidth(sidebarView.frame), contentView.frame.size.height);
}
[UIView commitAnimations];
舊答案:
聲音/看起來你只需要修改x位置,始終位於側邊欄的邊緣。 假設您的contentview的起源位於最左側,未經測試的代碼:
- (void)revealSidebar:(BOOL)shouldReveal {
if (shouldReveal) {
[UIView beginAnimations:@"" context:nil];
[UIView setAnimationDuration:0.3];
// Push the view to the right
contentView.transform = CGAffineTransformTranslate(contentView.transform, CGRectGetWidth(sidebarView.frame), 0);
// Resize the view so it fits on remaining part of the screen
contentView.frame = CGRectMake(contentView.frame.origin.x, contentView.frame.origin.y, contentView.frame.size.width-sidebarView.frame.size.width, contentView.frame.size.height);
[UIView commitAnimations];
} else {
[UIView beginAnimations:@"" context:nil];
[UIView setAnimationDuration:0.3];
// Resize the view so it fits on full screen
contentView.frame = CGRectMake(sidebarView.frame.size.width, contentView.frame.origin.y, contentView.frame.size.width-sidebarView.frame.size.width, contentView.frame.size.height);
[UIView commitAnimations];
}
_state.isShowing = shouldReveal ? 1 : 0;
}
如果原點實際上居中,那么:
contentView.frame = CGRectMake(sidebarView.frame.size.width+(contentView.frame.size.width/2), contentView.frame.origin.y, contentView.frame.size.width-sidebarView.frame.size.width, contentView.frame.size.height);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.