簡體   English   中英

使子視圖從另一個子視圖“后面”降序

[英]make subview descend from “behind” another subview

UISrollView ,我有幾個以編程方式添加的子視圖,它們表示樹中的節點:

在此處輸入圖片說明

每個節點的框架包括節點本身以及將其連接到其父節點的線。 (我這樣做是為了便於對帶有節點的線進行動畫處理。)在下圖中,為其中一個節點繪制了框架:

在此處輸入圖片說明

當用戶點擊節點之一時,兩個子節點“出生”。 我想通過讓子節點從父節點的后部向下下降來對此進行動畫處理。 我的基本動畫代碼是:

- (void)descendFromParent
{
    // Do nothing if this is root node
    if (!self.parent)
        return;

    // Move node to parent location
    self.frame = CGRectMake(self.frame.origin.x + self.parent.nodeFrame.origin.x - self.nodeFrame.origin.x,
                            self.frame.origin.y + self.parent.nodeFrame.origin.y - self.nodeFrame.origin.y,
                             self.frame.size.width, self.frame.size.height);

    // Animate the move back to original location
    [UIView animateWithDuration:1.0
                          delay:0.0
                        options:0
                     animations:^{
                         self.frame = self.trueFrame;
                     }
                     completion:nil];
}

nodeFrame是僅包含視圖的圓形部分的框架。)

當然,問題在於當子節點下降時,它(特別是該行)在父節點的上方和上方可見:

在此處輸入圖片說明

我嘗試了許多不同的方法來實現此目的-使用CGContextClip等-但它們都不起作用,主要是因為在動畫期間未調用drawRect:

我該如何進行這項工作?

您可能想看看UIView方法

  • -insertSubview:belowSubview:
  • -insertSubview:atIndex:
  • -sendSubviewToBack:

對於您的情況,可以在添加兩個子視圖后使用-sendSubviewToBack:將其發送到后台。 或者,您可以僅使用-insertSubview:atIndex:添加它們,並提供0作為索引。

我認為您的問題不是如何按正確的視圖層次結構排列視圖,而是以下內容:

將子磁盤布置在父磁盤后面之后,您希望它們向下滑動,並且在滑動時,連接它們中心的邊緣應具有第一個零長度(當所有三個磁盤都在同一位置時),並且然后進行擴展,直到最終達到其最終長度。

如果是這種情況,一種可能的解決方案是:

讓我們稱一個磁盤的初始x,y中心坐標(0,0)和最終坐標(X,Y)。 使用常規的動畫代碼,很容易在時間t內將子中心移動到(X,Y)。
現在假設您有一個附加的圖像視圖,該視圖顯示了沿對角線的邊緣。 在最終位置,“邊緣視圖”的中心位於(X / 2,Y / 2),其大小為(X,Y)。 如果此視圖放置在所有其他視圖的后面,它將在最終位置連接兩個磁盤。
動畫現在包括1)將center屬性從初始位置(0,0)更改為(X / 2,Y / 2),以及2)將視圖的比例(使用其transform屬性 )從零更改為最終大小,也在時間t中。
這應該做。

您可以為子視圖指定索引,嘗試在索引0處插入要設置動畫的節點,並使藍色節點在較高的索引處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM