2012-03-14 14 views
0

私は、本来のiPhoneのカレンダーのように、昼間のビューカレンダーを作っています。同じ大きさで同じ時間であれば、タイルをネイティブカレンダーと同じ位置に並べようとしています。iOS:複数の交差ビュー

しかし、私は2タイルではなく、複数のタイルにどのように行うのか理解することができます。添付画像には4枚のタイルがあります。私は最初のタイルを左端に、2番目のタイルを最初のタイルの直後に持っています。今、私は追加のタイルを追加する方法を理解する必要がありますか?

2タイル以上の場合、どうすればよいですか?画像について

:あなたはそれを見ることができない場合は3番目のタイルは(あなたは、彼らが互いの上にあるので、それは少し暗い見ることができる第二のタイルの岩下です

screenshot

- (void)layoutSubviews 
{ 
    // Set the main 
    for (UIView *view in self.subviews) { 
     APCalendarDayTile *tile = (APCalendarDayTile *)view; 
     CGFloat startPos = [APCalendarCurrentDayView yAxisForTime:[APCalendarCurrentDayView minutesToTime:tile.appointment.startDate]]; 
     CGFloat endPos = [APCalendarCurrentDayView yAxisForTime:[APCalendarCurrentDayView minutesToTime:tile.appointment.endDate]]; 
     tile.frame = CGRectMake(kLeftSideBuffer, startPos, (self.bounds.size.width - kLeftSideBuffer) , endPos - startPos); 
     tile.backgroundColor = [UIColor colorWithHexString:tile.appointment.appointmentColor]; 
    } 

    for (UIView *view in self.subviews) { 
     APCalendarDayTile *tile = (APCalendarDayTile *)view; 

     if ([self viewIntersectsWithAnotherView:tile]) { 

     } 
    } 
} 

- (BOOL)viewIntersectsWithAnotherView:(UIView*)selectedView{ 
    NSArray *subViewsInView=[self subviews];// I assume self is a subclass 
    // of UIViewController but the view can be 
    //any UIView that'd act as a container 
    //for all other views. 
    for (UIView *theView in subViewsInView){ 
     if (![selectedView isEqual:theView]) { 
      if(CGRectIntersectsRect(selectedView.frame, theView.frame)) { 
       if ((selectedView.frame.origin.y == theView.frame.origin.y) && (selectedView.frame.size.height == theView.frame.size.height)) { 
        if (theView.frame.size.width == self.bounds.size.width - kLeftSideBuffer) { 
         theView.frame = CGRectMake(theView.frame.origin.x, selectedView.frame.origin.y, theView.frame.size.width/2, selectedView.frame.size.height); 
        } 
        selectedView.frame = CGRectMake(theView.frame.origin.x + theView.frame.size.width, selectedView.frame.origin.y, theView.frame.size.width, selectedView.frame.size.height); 
        return YES; 
       } 
      } 
     } 
    } 
    return NO; 
} 

答えて

0

[OK]を、

私はみかん彼の擬似コードは、IF/ELSEに意味がありませんでした、しかしSaltyMuleのアプローチを取りました。

- (void)layoutSubviews 
{ 
    // Set the main 
    for (UIView *view in self.subviews) { 
     APCalendarDayTile *tile = (APCalendarDayTile *)view; 
     CGFloat startPos = [APCalendarCurrentDayView yAxisForTime:[APCalendarCurrentDayView minutesToTime:tile.appointment.startDate]]; 
     CGFloat endPos = [APCalendarCurrentDayView yAxisForTime:[APCalendarCurrentDayView minutesToTime:tile.appointment.endDate]]; 
     tile.frame = CGRectMake(kLeftSideBuffer, startPos, (self.bounds.size.width - kLeftSideBuffer) , endPos - startPos); 
     tile.backgroundColor = [UIColor colorWithHexString:tile.appointment.appointmentColor]; 
    } 

    [sameTimeAppointments removeAllObjects]; 

    for (UIView *view in self.subviews) { 
     APCalendarDayTile *tile = (APCalendarDayTile *)view; 

     if ([self viewIntersectsWithAnotherView:tile]) { 
      if ([sameTimeAppointments objectForKey:[NSString stringWithFormat:@"%f", tile.frame.origin.y]] != nil) { 
       NSMutableArray *tempArray = [[sameTimeAppointments objectForKey:[NSString stringWithFormat:@"%f", tile.frame.origin.y]] mutableCopy]; 
       [tempArray addObject:tile]; 
       [sameTimeAppointments setValue:tempArray forKey:[NSString stringWithFormat:@"%f", tile.frame.origin.y]]; 
      } else { 
       [sameTimeAppointments setValue:[NSMutableArray arrayWithObject:tile] forKey:[NSString stringWithFormat:@"%f", tile.frame.origin.y]]; 
      } 
     } 
    } 
    for (NSString *currentDict in sameTimeAppointments) { 
     NSArray *currentAppointments = [sameTimeAppointments objectForKey:currentDict]; 
     float tileWidth = ((self.frame.size.width - kLeftSideBuffer)/[currentAppointments count]); 
     for (int i = 0; i < [currentAppointments count]; i++) { 
      APCalendarDayTile *tile = [currentAppointments objectAtIndex:i]; 
      float xPos = 0.0 + kLeftSideBuffer; 
      if (i != 0) { 
       xPos = (((APCalendarDayTile *)[currentAppointments objectAtIndex:i - 1]).frame.origin.x + tileWidth); 
      } 

      tile.frame = CGRectMake(xPos, tile.frame.origin.y, tileWidth, tile.frame.size.height); 
      [self bringSubviewToFront:tile]; 
     } 
    } 
} 

- (BOOL)viewIntersectsWithAnotherView:(UIView*)selectedView{ 
    NSArray *subViewsInView=[self subviews];// I assume self is a subclass 
    // of UIViewController but the view can be 
    //any UIView that'd act as a container 
    //for all other views. 
    for (UIView *theView in subViewsInView){ 
     if (![selectedView isEqual:theView]) { 
      if(CGRectIntersectsRect(selectedView.frame, theView.frame)) { 
       if ((selectedView.frame.origin.y == theView.frame.origin.y) && (selectedView.frame.size.height == theView.frame.size.height)) { 
        return YES; 
       } 
      } 
     } 
    } 
    return NO; 
} 
1

あなたのテストが

if ((selectedView.frame.origin.y == theView.frame.origin.y) && (selectedView.frame.size.height == theView.frame.size.height)) 

のみ等しいyの起源と高さのビューに適用されているように見え、私は以下の擬似コードを使用してこの問題を解決するだろう:。

initialize an empty arranged subviews array 
initialize a nil previous subview 
for every subview 
    if the subview intersects with the previous subview 
     ensure the subview and the previous subview are added to the arranged subviews array 
    else if the arranged subviews array is not empty 
     arrange the subviews in the array across the width of their superview 
     empty the arranged subview array 
+0

いいえ私はそれが正しいです。私は同じ時間に始まり、同じ長さに並んでいるものだけが必要です – Bot

+0

あなたのif/elseはちょっと混乱しているようです。 – Bot