UIDIewカスタムインタラクション

3440 ワード

ビューレベル
UIViewには、UIresponder、UIView、およびUIcontrolの3つのベースクラスがあります.
  • UIresponder:UIViewの親です.responderはタッチ,ジェスチャー,遠隔制御イベントを処理する.UIApplicationとUIViewControllerもUIresponderのサブクラスです.
  • UIView:描画とタッチ時間を処理します.
  • UIcontrol:target/actionモードがあります.button、Date pickers、テキストボックスはすべてです.

  • レンダー(Render)
    drawRectの使用を避ける:CPU上でレンダリングを行い、GPUレンダリングを使用する場合は既存のビューを使用してカスタムビューを構築します.枠線付きの円形のアイコンを実装する場合
    - (void)setupView
    {
         self.clipsToBounds = YES;
         self.layer.cornerRadius = self.bounds.size.width / 2;
         self.layer.borderWidth = 3;
         self.layer.borderColor = [UIColor darkGrayColor].CGColor;
    }
    

    レンダー速度比較OpenGL->Core Image->Core Graphics
    カスタムインタラクション
    タッチに応答して,より下位層のtouchesBegan,touchesMoved,touchesEndedメソッドを書き換えることができる.target action、エージェント、block、KVO、通知などの他の異なる方法を使用して解決することもできます.
    Target action:
    最も便利なやり方であり、最も学院派でもある.
    [self sendActionsForControlEvents:UIControlEventValueChanged];
    
    //    view controller      
    - (void)setupPieChart
    {
         [self.pieChart addTarget:self
              action:@selector(updateSelection:)
              forControlEvents:UIControlEventValueChanged];
    }
    
    - (void)updateSelection:(id)sender
    {
         NSLog(@"%@", self.pieChart.selectedSector);
    }
    

    プロキシの使用
    [self.delegate pieChart:self didSelectSector:self.selectedSector];
    
    // view controller   
    @interface MyViewController 
    
    ...
    
    - (void)setupPieChart
    {
         self.pieChart.delegate = self;
    }
    
    - (void)pieChart:(PieChart*)pieChart didSelectSector:(PieChartSector*)sector
    {
         //     
    }
    

    Blockの使用
    @interface PieChart : UIControl
    
    @property (nonatomic,copy) void(^selectionHandler)(PieChartSection* selectedSection);
    
    @end
    
    //        block     ,     block  
    if (self.selectionHandler != NULL) {
         self.selectionHandler(self.selectedSection);
    }
    
    //           view controller 
    - (void)setupPieChart
    {
         self.pieChart.selectionHandler = ^(PieChartSection* section) {
              //     
         }
    }
    
    //      
    __weak id weakSelf = self;
    self.pieChart.selectionHandler = ^(PieChartSection* section) {
         MyViewController* strongSelf = weakSelf;
         [strongSelf handleSectionChange:section];
    }
    

    KVOの使用
    self.selectedSegment = theNewSelectedSegment;
    - (void)setupPieChart
    {
         [self.pieChart addObserver:self forKeyPath:@"selectedSegment" options:0 context:NULL];
    }
    
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
         if(object == self.pieChart && [keyPath isEqualToString:@"selectedSegment"]) {
              //     
         }
    }
    // viewWillDisappear: dealloc      。
    

    通知の使用
    //    
    extern NSString* const SelectedSegmentChangedNotification;
    //      
    NSString* const SelectedSegmentChangedNotification = @"selectedSegmentChangedNotification";
    
    ...
    
    - (void)notifyAboutChanges
    {
         [[NSNotificationCenter defaultCenter] postNotificationName:SelectedSegmentChangedNotification object:self];
    }
    //      , view controller   
    - (void)setupPieChart
    {
         [[NSNotificationCenter defaultCenter] addObserver:self
              selector:@selector(segmentChanged:)
              name:SelectedSegmentChangedNotification
              object:self.pieChart];
    
    }
    ...
    
    - (void)segmentChanged:(NSNotification*)note
    {
    }
    //