SORU
8 AĞUSTOS 2013, PERŞEMBE


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
9 AĞUSTOS 2013, Cuma


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:

enter image description here

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChrisCrossMedia

    ChrisCrossMe

    17 EYLÜL 2009
  • MrOctopi

    MrOctopi

    6 Aralık 2010
  • Paulo Bautista

    Paulo Bautis

    21 Aralık 2008