Nasıl superview otomatik düzen ile tüm subviews uyacak şekilde yeniden boyutlandırmak için?
Otomatik düzen anlayışım subviews konumları hesaplar sınırlar ve iç boyutları üzerinde superview ve temel boyutunu alır.
Bir şekilde bu süreci tersine çevirmek için var mı? Sınırlar ve iç boyutları bazında superview yeniden boyutlandırmak istiyorum. Bunu elde etmenin en kolay yolu nedir?
UITableView
için bir başlık olarak kullanıyorum. böyle büyük mükafat olarak tasarladım. Bu görünüm, bir etiket ve bir düğme içerir. Etiket boyutu veri bağlı olarak değişir. Etiket başarıyla düğmesini aşağı iter veya etiket sıkıştırılmış superview düğme arasında sınırlamak ve bir alt varsa bağlı olarak sınırlar.
Birkaç benzer bir soru buldum ama iyi ve kolay cevaplar yok.
CEVAP
Kullanmak için doğru API UIView systemLayoutSizeFittingSize:
ya da UILayoutFittingCompressedSize
UILayoutFittingExpandedSize
geçiyor.
UIView
normal kullanarak bir otomatik düzen için bu kısıtlamalar, doğru olarak çalışması gerekir. Eğer UITableViewCell
(örneğin satır yüksekliğini belirlemek için) kullanmak istiyorsanız, o zaman cep contentView
karşı çağrı ve yükseklik kapmak gerekir.
İleri değerlendirmeler eğer çok satırlı olan görünümünde bir veya daha fazla UİLabel şey varsa var. Bunlar için preferredMaxLayoutWidth
özelliği gibi bir etiket doğru sağlayan doğru ayarlanmış olması imperitive systemLayoutSizeFittingSize's
hesaplamada kullanılacak intrinsicContentSize
,.
İstek üzerine, bir tablo için yükseklik hesaplama örnek ekleyerek hücre görünümü . EDİT:
Tablo-hücre yüksekliği hesaplama için otomatik düzen kullanarak, özellikle eğer karmaşık bir düzene sahip bir hücre varsa kesinlikle uygundur ama çok verimli değil.
Eğer çok satırlı UILabel
kullanıyorsanız etiket genişliği preferredMaxLayoutWidth
senkronize etmek gerektiği konusunda yukarıda dediğim gibi. UILabel
bunu yapmak için özel bir alt sınıfı kullanın:
@implementation TSLabel
- (void) layoutSubviews
{
[super layoutSubviews];
if ( self.numberOfLines == 0 )
{
if ( self.preferredMaxLayoutWidth != self.frame.size.width )
{
self.preferredMaxLayoutWidth = self.frame.size.width;
[self setNeedsUpdateConstraints];
}
}
}
- (CGSize) intrinsicContentSize
{
CGSize s = [super intrinsicContentSize];
if ( self.numberOfLines == 0 )
{
// found out that sometimes intrinsicContentSize is 1pt too short!
s.height = 1;
}
return s;
}
@end
İşte yapmacık UİTableViewController bir alt heightForRowAtİndexPath gösteren:
#import "TSTableViewController.h"
#import "TSTableViewCell.h"
@implementation TSTableViewController
- (NSString*) cellText
{
return @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
}
#pragma mark - Table view data source
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView
{
return 1;
}
- (NSInteger) tableView: (UITableView *)tableView numberOfRowsInSection: (NSInteger) section
{
return 1;
}
- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath
{
static TSTableViewCell *sizingCell;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sizingCell = (TSTableViewCell*)[tableView dequeueReusableCellWithIdentifier: @"TSTableViewCell"];
});
// configure the cell
sizingCell.text = self.cellText;
// force layout
[sizingCell setNeedsLayout];
[sizingCell layoutIfNeeded];
// get the fitting size
CGSize s = [sizingCell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize];
NSLog( @"fittingSize: %@", NSStringFromCGSize( s ));
return s.height;
}
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
TSTableViewCell *cell = (TSTableViewCell*)[tableView dequeueReusableCellWithIdentifier: @"TSTableViewCell" ];
cell.text = self.cellText;
return cell;
}
@end
Basit bir özel hücre:
#import "TSTableViewCell.h"
#import "TSLabel.h"
@implementation TSTableViewCell
{
IBOutlet TSLabel* _label;
}
- (void) setText: (NSString *) text
{
_label.text = text;
}
@end
Ve, burada kısıtlamalar Film Şeridi olarak tanımlanan bir resim. Etiket genişliği kısıtlamaları/yüksekliği vardır hiç unutmayın - bu intrinsicContentSize
etiket algılanır:
Nasıl otomatik olarak bir DataGridView...
Görüntü otomatik div konteyner sığacak...
Nasıl jQuery DatePicker kontrol yenide...
Nasıl otomatik düzen, görünüm gizli ve...
Nasıl AVD öykünücüsü (Eclipse) yeniden...