SORU
16 Kasım 2011, ÇARŞAMBA


Nasıl özel bir görünüm Kakao Otomatik Düzen ile pencere boyutlandırma yapmak için?

Tek bir özel görünüm ile tek bir pencere var, ve o tamamen, herhangi bir zamanda doldurur özel görünüm penceresi ile yeniden boyutlandırmak istiyorum. Eğer yazarsam:

NSView *contentView = [self.window contentView];
CustomView *customView = [[CustomView alloc] initWithFrame:[contentView bounds]];
[contentView addSubview:customView];
[contentView addConstraint:
    [NSLayoutConstraint constraintWithItem:customView
        attribute:NSLayoutAttributeWidth
        relatedBy:NSLayoutRelationEqual
        toItem:contentView
        attribute:NSLayoutAttributeWidth
        multiplier:1
        constant:0]];
[contentView addConstraint:
    [NSLayoutConstraint constraintWithItem:customView
        attribute:NSLayoutAttributeHeight
        relatedBy:NSLayoutRelationEqual
        toItem:contentView
        attribute:NSLayoutAttributeHeight
        multiplier:1
        constant:0]];

Sonra pencereyi yeniden boyutlandırmak bana izin vermiyor.
Eğer eklersem:

[customView setTranslatesAutoresizingMaskIntoConstraints:NO];

Görünüm görünmüyor özel (drawRect: asla denilen gibi görünüyor). Farklı şekillerde (görsel biçim @"|[customview]|" dahil) denedim ama hep aynı sorun. Eski autoresizing sistemi ile yapılabileceğini biliyorum:

[customView setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];

ama Kakao Otomatik Düzen sistemi kullanmak istiyorum, ve daha karmaşık durumlarda (her zaman penceresini dolduracak birkaç özel görünümler gibi) için kullanmak istiyorum.

Herkes neyin yanlış olduğunu ve Otomatik Düzen sistem istediğim sonucu elde etmek için kullanmam gerektiğini nasıl biliyor mu?

CEVAP
17 Kasım 2011, PERŞEMBE


Otomatik Düzen ile, (en az) üç olası yolları tüm pencere içeriğini görüntülemek kaplar, böylece bir görünüm sınırlamak için, uygun olduğunda yeniden boyutlandırma vardır.

Superview ile ilgili görsel biçim kısıtlamaları

NSView *contentView = [_window contentView];
MyView *customView = [[MyView alloc] initWithFrame:[contentView bounds]];
[customView setTranslatesAutoresizingMaskIntoConstraints:NO];

[contentView addSubview:customView];

NSDictionary *views = NSDictionaryOfVariableBindings(customView);

[contentView addConstraints:
    [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[customView]|"
        options:0
        metrics:nil
        views:views]];

[contentView addConstraints:
    [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[customView]|"
    options:0
    metrics:nil
    views:views]];

Kenarları için program kısıtlamaları

(bu görsel biçim yukarıdaki eşdeğer olmalıdır)

  (void)addEdgeConstraint:(NSLayoutAttribute)edge superview:(NSView *)superview subview:(NSView *)subview {
    [superview addConstraint:[NSLayoutConstraint constraintWithItem:subview
        attribute:edge
        relatedBy:NSLayoutRelationEqual
        toItem:superview
        attribute:edge
        multiplier:1
        constant:0]];
}

ve

NSView *contentView = [_window contentView];
MyView *customView = [[MyView alloc] initWithFrame:[contentView bounds]];
[customView setTranslatesAutoresizingMaskIntoConstraints:NO];

[contentView addSubview:customView];

[[self class] addEdgeConstraint:NSLayoutAttributeLeft superview:contentView subview:customView];
[[self class] addEdgeConstraint:NSLayoutAttributeRight superview:contentView subview:customView];
[[self class] addEdgeConstraint:NSLayoutAttributeTop superview:contentView subview:customView];
[[self class] addEdgeConstraint:NSLayoutAttributeBottom superview:contentView subview:customView];

Boyutu programlı kısıtlama

NSView *contentView = [_window contentView];
MyView *customView = [[MyView alloc] initWithFrame:[contentView bounds]];
[customView setTranslatesAutoresizingMaskIntoConstraints:NO];

[contentView addSubview:customView];

[contentView addConstraint:
    [NSLayoutConstraint constraintWithItem:customView
        attribute:NSLayoutAttributeWidth
        relatedBy:NSLayoutRelationEqual
        toItem:contentView
        attribute:NSLayoutAttributeWidth
        multiplier:1
        constant:0]];
[contentView addConstraint:
    [NSLayoutConstraint constraintWithItem:customView
        attribute:NSLayoutAttributeHeight
        relatedBy:NSLayoutRelationEqual
        toItem:contentView
        attribute:NSLayoutAttributeHeight
        multiplier:1
        constant:0]];

Üçüncü yaklaşım bir soru listelenir ve daha fazla kısıtlamalar varsa işe yaramayabilir. Örneğin, olmadan

[customView setTranslatesAutoresizingMaskIntoConstraints:NO];

davranışları soru açıklanan yol açan özgün autoresize maske olarak uygulanır: pencere yeniden boyutlandırılabilir değildir.

Regexident tarafından belirtildiği gibi kullanabilirsiniz:

[_window visualizeConstraints:[contentView constraints]];

Otomatik Düzen hata ayıklamak için. Çıkış olarak iyi konsol araştırmaya değer.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChrisCrossMedia

    ChrisCrossMe

    17 EYLÜL 2009
  • TheDailyTechDose

    TheDailyTech

    15 EKİM 2012
  • Truc Minh

    Truc Minh

    23 Ocak 2011