2013-03-18 16 views
9

Otomatik düzen kullanarak bir düğmeyi kolayca gizlemek ve göstermek için bir yol olabileceğini düşündüm; bu sayede görünümler, görünür olana bağlı olarak otomatik olarak düzgün bir şekilde düzenlenebilir. Ben üç düğmeyi görmek için şimdi istediğiniz indir bastığınızdaOtomatik düzenleme kullanırken görünümleri gizlice gizleme ve gösterme

// pseudo visual format code: 
|-----[star][download]-----| 

: (pause yeniden etiketlenmek download butonu; cancel olduğunu Örneğin

, ben her zaman bir çerçevenin merkezine istediğiniz iki düğme olduğunu varsayalım önceden gizlenmiş düğme)

|--[star][cancel][pause ]--|

Ben belki yapmak genişliği her zaman mevcut her üç düğme vardır ama belki geçersiz düşündüm incelikle devletler arasında hareketlendirmek? Otomatik düzen yapısından görünümlerin eklenmesi ve kaldırılması için daha semantik bir yol olabileceğini düşündüm. Düşüncesi olan var mı?

+0

Downlaod eylemi setine gizlemek için & duraklama iptal düğmesi http://stackoverflow.com/ sorular/20876664/ios-autolayout-dinamik olarak ayarlama-denetimleri/20876746? noredirect = 1 # comment31327381_20876746 :) – Abhishek

cevap

0

ben birlikte bu özel UIView alt sınıfı kullanılarak yapılabilir gösteren küçük bir örnek hazırladık. Aşağıdaki örnekte, AutoLayout framework'u this answer'dan kullandım ve aynısını yapmanızı öneririm; kısıtlama kodunu temiz ve okunaklı tutar.

Genel yaklaşım, soldaki düğmelerin arka kenarını sağdakilerin ön kenarına bağlayan ve sonra sınırlamaları dinamik olarak eklemek/kaldırmak için bu işaretçileri kullanan anahtar kısıtlamalarına işaretçiler tutmanız gerektiğidir. Genel olarak, bunu yapmak istemezsiniz çünkü performans zahmete girer, ancak kullanıcı eylemine yanıt olarak küçük bir miktar sorun olur.

@protocol TSDownloadViewDelegate; 
@interface TSDownloadView : UIView 
    @property (strong, nonatomic)   id<TSDownloadViewDelegate> delegate; 
@end 

@protocol TSDownloadViewDelegate <NSObject> 
    - (void) downloadStartedInDownloadView:(TSDownloadView*)downloadView; 
    - (void) downloadPausedInDownloadView:(TSDownloadView *)downloadView; 
    - (void) downloadCancelledInDownloadView:(TSDownloadView*)downloadView; 
@end 

Ve böyle hayata:

Bence bu şekilde bildirilmiş bulunmaktadır görünümü gerçekten işlevsel hale getirmek için yapılacak daha çok iş, bir sürü, ama umarım genel görebilirsiniz

#import "UIView+AutoLayout.h" 
#import "TSDownloadView.h" 

static const CGFloat  kMargin    = 20.0; 

@interface TSDownloadView() 

    // Our buttons 
    @property (strong, nonatomic)   UIButton * starButton; 
    @property (strong, nonatomic)   UIButton * cancelButton; 
    @property (strong, nonatomic)   UIButton * downloadButton; 

    // State tracking 
    @property (nonatomic)     BOOL   downloading; 
    @property (nonatomic)     BOOL   constraintsUpdated; 

    // The constraint governing what's tied to the right hand side of the starButton 
    @property (weak, nonatomic)   NSLayoutConstraint *starRightConstraint; 

    // The constraint governing what's tied to the left hand side of the downloadButton 
    @property (weak, nonatomic)   NSLayoutConstraint *downloadLeftConstraint; 

@end 

@implementation TSDownloadView 

- (void) initializator 
{ 
    _starButton = [UIButton buttonWithType:UIButtonTypeSystem]; 
    _cancelButton = [UIButton buttonWithType:UIButtonTypeSystem]; 
    _downloadButton = [UIButton buttonWithType:UIButtonTypeSystem]; 

    _starButton.translatesAutoresizingMaskIntoConstraints = NO; 
    _cancelButton.translatesAutoresizingMaskIntoConstraints = NO; 
    _downloadButton.translatesAutoresizingMaskIntoConstraints = NO; 

    _starButton.titleLabel.textAlignment = NSTextAlignmentCenter; 
    _cancelButton.titleLabel.textAlignment = NSTextAlignmentCenter; 
    _downloadButton.titleLabel.textAlignment = NSTextAlignmentCenter; 

    [_starButton setTitle:@"Star" forState:UIControlStateNormal]; 
    [_cancelButton setTitle:@"Cancel" forState:UIControlStateNormal]; 
    [_downloadButton setTitle:@"Download" forState:UIControlStateNormal]; 

    [_downloadButton addTarget:self action:@selector(downloadClicked:) forControlEvents:UIControlEventTouchUpInside]; 

    [self addSubview:_starButton]; 
    [self addSubview:_cancelButton]; 
    [self addSubview:_downloadButton]; 

    _cancelButton.hidden = YES; 

} 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     [self initializator]; 
    } 
    return self; 
} 

- (id) initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if(self) 
    { 
     [self initializator]; 
    } 
    return self; 
} 


- (void)downloadClicked:(id)sender 
{ 
    self.downloading = !self.downloading; 
    if(self.downloading) 
    { 
     [self.downloadButton setTitle:@"Pause" forState:UIControlStateNormal]; 
     self.cancelButton.hidden = NO; 

     // Remove previous constraints 
     [self removeConstraint:self.starRightConstraint]; 
     [self removeConstraint:self.downloadLeftConstraint]; 

     // |--[star][cancel][pause ]--| 
     self.starRightConstraint = [self.starButton autoPinEdge:ALEdgeRight toEdge:ALEdgeLeft ofView:self.cancelButton withOffset:-kMargin]; 
     self.downloadLeftConstraint = [self.downloadButton autoPinEdge:ALEdgeLeft toEdge:ALEdgeRight ofView:self.cancelButton withOffset:kMargin]; 

     // Tell delegate what's happened 
     if(self.delegate) 
      [self.delegate downloadStartedInDownloadView:self]; 
    } 
    else 
    { 
     [self.downloadButton setTitle:@"Download" forState:UIControlStateNormal]; 
     self.cancelButton.hidden = YES; 

     // Remove previous constraints 
     [self removeConstraint:self.starRightConstraint]; 
     [self removeConstraint:self.downloadLeftConstraint]; 

     // |-----[star][download]-----| 
     self.starRightConstraint = [self.starButton autoPinEdge:ALEdgeRight toEdge:ALEdgeLeft ofView:self.downloadButton withOffset:-kMargin]; 
     self.downloadLeftConstraint = nil; 

     // Tell delegate what's happened 
     if(self.delegate) 
      [self.delegate downloadPausedInDownloadView:self]; 
    } 

} 

- (void) updateConstraints 
{ 
    [super updateConstraints]; 
    if(self.constraintsUpdated) return; 
     self.constraintsUpdated = YES; 

    // Now put our constraints in place 

    // Make sure the button hugs the label and doesn't get stretched 
    // just because there's space available 
    [self.starButton setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; 

    // Pin the starButton to the top, left and bottom edges of its superview 
    [self.starButton autoPinEdgeToSuperviewEdge:ALEdgeTop withInset:kMargin]; 
    [self.starButton autoPinEdgeToSuperviewEdge:ALEdgeLeft withInset:kMargin]; 
    [self.starButton autoPinEdgeToSuperviewEdge:ALEdgeBottom withInset:kMargin]; 

    // Repeat for the other buttons 

    [self.cancelButton setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; 
    [self.cancelButton autoPinEdgeToSuperviewEdge:ALEdgeTop withInset:kMargin]; 
    [self.cancelButton autoPinEdgeToSuperviewEdge:ALEdgeBottom withInset:kMargin]; 

    [self.downloadButton setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; 
    [self.downloadButton autoPinEdgeToSuperviewEdge:ALEdgeTop withInset:kMargin]; 
    [self.downloadButton autoPinEdgeToSuperviewEdge:ALEdgeBottom withInset:kMargin]; 
    [self.downloadButton autoPinEdgeToSuperviewEdge:ALEdgeRight withInset:kMargin]; 


    // These two are special. We keep a reference to them so we can replace 
    // them later. Note that since the cancelButton is hidden at the start, 
    // the initial value for downloadLeftConstraint is simply nil. 

    self.starRightConstraint = [self.starButton autoPinEdge:ALEdgeRight toEdge:ALEdgeLeft ofView:self.downloadButton withOffset:-kMargin]; 
    self.downloadLeftConstraint = nil; 
} 
@end 

almak için yaklaşım.

0

(5) düğmelerini Autolayout'u kullanarak bir diğerinin üzerine tasarlayın.

// viewDidLoad tarih: Ben benzer soru soruldu ve downvoted got

-(void) viewDidLoad 
{ 
    [_pauseBtn setHidden:YES]; 
    [_cancelBtn setHidden:YES]; 
} 

//

-(IBAction) downloadClick (UIButton *) sender 
{ 
    [_pauseBtn setHidden:NO]; 
    [_cancelBtn setHidden:NO]; 
    [sender setHidden:YES]; 
} 
İlgili konular