2012-10-14 36 views
1

我很难搞清楚如何在DetailView故事板中动态定位对象。动态定位故事板中的iOS对象

对于初学者来说,该应用遵循传统博客格式,其中,所述马西德威是一个UITableView(或UICollectionView)具有多个桩。

当用户点击其中的一个,一个SEGUE导致的DetailView。

一切正确加载,除了在的DetailView的元件的定位。

这是它的外观:

enter image description here

顶部UIImageView有固定的高度,因此不会与Post Text Label重叠。

然而,Post Text Label具有可变的高度,一些后文本是比别人更长的时间。这由我正在使用的类别来动态调整大小(resizeToFit)。这一切都很好。

现在的问题是,当Post Text Label垂直增长时,我需要View - Byline(绿色矩形)根据Post Text Label的垂直尺寸向下移动。我不能让它向下移动。

您可以看到我将所有View - Byline对象放在视图中,因此它们通过仅将View - Byline以编程方式更改位置而一起移动。

你知道我可以用它来做到这一点的任何方法吗?任何指针,教程或智慧非常感谢。

DetailViewController.h

#import <UIKit/UIKit.h> 

@interface DetailViewController : UIViewController { 
    IBOutlet UIImageView *postThumbView; 
    IBOutlet UILabel  *postTextLabel; 
    IBOutlet UIImageView *postAuthorPictureView; 
    IBOutlet UILabel  *postAuthorNameLabel; 
    IBOutlet UILabel  *postTimestampLabel; 
    IBOutlet UIScrollView *scroller; 
    IBOutlet UIView  *postBylineView; 
} 

@property (strong, nonatomic) id detailItem; 

@end 

DetailViewController.m

... 
[postThumbView setImageWithURL:[NSURL URLWithString:postThumbUrl] placeholderImage:[UIImage imageNamed:@"default"]]; 

[postAuthorPictureView setImageWithURL:[NSURL URLWithString:authorPicture] placeholderImage:[UIImage imageNamed:@"default"]]; 

postTextLabel.text = postText; 
postTextLabel.frame = CGRectMake(postTextLabel.frame.origin.x, 
           postThumbView.frame.origin.y + postThumbView.frame.size.height, 
           postTextLabel.frame.size.width, 
           postTextLabel.frame.size.height); 
[postTextLabel resizeToFit]; 

postAuthorNameLabel.text = postAuthorName; 
postTimestampLabel.text = postTimestamp; 
+0

您是否正在使用具有AutoResizing Masks的AutoLayout或iOS 4.3+的iOS 6+?我问,因为具有AutoLayout的iOS 6+将会非常轻松地满足您的要求。 –

+0

@RoboticCat我正在使用ios6 - 我一直在保持“使用autolayout”框中选中,但没有注意到它在我的问题上有所作为 - 我该如何处理这个问题? – pepe

回答

2

如果你的目标iOS6的,你应该检查自动布局约束。如果没有,你不能用你已经做过的相同的方法重新定位postTextLabel。因此,对于postByLine,将其放置在相对于textLabel文章的底部。

postByLine.frame = CGRectMake(postByLine.frame.origin.x, 
             postTextLabel.frame.origin.y + postTextLabel.frame.size.height, 
             postByLine.frame.size.width, 
             postByLine.frame.size.height); 
+0

是否需要关闭自动布局才能使用?我真的有它,并看到你的代码没有任何影响 - 我以前试过这个,不知道为什么它会为'postTextLabel'工作,但不是为其他元素('postByline') – pepe

+0

是的,我认为是的,还要确保autoresize子视图被禁用/未检查postByLine的超级视图。但是,由于您使用的是ios6,请考虑查看约束http://www.raywenderlich.com/20897/beginning-auto-layout-part-2-of-2 –

+0

谢谢@edwin - 如果未选中“剪辑子视图” ? – pepe

0

我认为阅读post recommended by @edwin对理解AutoLayout很重要。

例如,虽然我在故事板有自动版式ON,如预期的元素并没有调整自己的位置。

这个问题(在上面链接的帖子中提到)是,AutoLayout期望您在一定距离阈值内将您的元素彼此相邻放置,否则它们不会创建(并维持)它们之间的关系。

如果你看看我上面的原始帖子,你会看到绿色的矩形(后排)。随着帖子文字在垂直尺寸上的增加,它并没有下移。

那是因为当我最初创建了旁线框时,我把它放在离开文本标签的底部边界太远的地方。一旦我将它拉近,两个元素之间就会出现一个H形图标,表示已创建关系。

然后一切按预期工作。大多数默认距离阈值大约为8分,但是一旦建立关系,您可以稍后按照您认为合适的方式增加距离。

+0

请注意,您也可以手动创建两个视图之间的关系,方法是选择两个视图,转到底部的“Contstraints”按钮,然后选择“Pin Vertical Spacing” –