0

BoardViewController (UIViewController)があり、その背景に中心座標線を描画する必要があります。これらの座標線のために、subView として追加されるカスタム UIView クラスCoordinateViewを作成しました。デバイスの向きを変更しても、coordinateView は中央に配置され、画面全体に表示される必要があります。

これを行うには、コードで実装された自動レイアウトを使用したいと思います。これが私の現在の設定です:

CoordinatesView (UIView) クラスでは、座標線のカスタム描画メソッド

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextSetLineWidth(context, 1.0);

    CGContextMoveToPoint(context, self.bounds.size.width/2,0);
    CGContextAddLineToPoint(context, self.bounds.size.width/2,self.bounds.size.height); 
    CGContextStrokePath(context);
    CGContextMoveToPoint(context, 0,self.bounds.size.height/2);
    CGContextAddLineToPoint(context, self.bounds.size.width,self.bounds.size.height/2); 

    CGContextStrokePath(context);
}

BoardViewControllerでこの座標ビューオブジェクトを初期化する

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
...
        coordinatesView = [[CoordinatesView alloc]initWithFrame:self.view.frame];
        [coordinatesView setBackgroundColor:[UIColor redColor]];
        [coordinatesView clipsToBounds];
        [coordinatesView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [self.view addSubview:coordinatesView];
        [self.view sendSubviewToBack:coordinatesView];
...
}

BoardViewController のviewWillAppear関数で、coordinateView に自動レイアウトマジックを追加する

-(void)viewWillAppear:(BOOL)animated{
...
NSLayoutConstraint *constraintCoordinatesCenterX =[NSLayoutConstraint
                                              constraintWithItem:self.view
                                              attribute:NSLayoutAttributeCenterX
                                              relatedBy:NSLayoutRelationEqual
                                              toItem:coordinatesView
                                              attribute:NSLayoutAttributeCenterX
                                              multiplier:1.0
                                              constant:1];

NSLayoutConstraint *constraintCoordinatesCenterY =[NSLayoutConstraint
                                                   constraintWithItem:self.view
                                                   attribute:NSLayoutAttributeCenterY
                                                   relatedBy:NSLayoutRelationEqual
                                                   toItem:coordinatesView
                                                   attribute:NSLayoutAttributeCenterY
                                                   multiplier:1.0
                                                   constant:1];

[self.view addConstraint: constraintCoordinatesCenterX];
[self.view addConstraint: constraintCoordinatesCenterY];
...
}

注: このアプローチは、UIImageView 画像を座標として使用して機能しましたが、カスタム UIView 座標ビューでは機能しません。

  • 再び機能させるにはどうすればよいですか?Auto Layout/NSLayoutConstraint を適用するとすぐに、coordinatesView UIView が消えたようです

  • これは実際に UIViewController に背景描画を追加する良い方法ですか、それとも UIViewController に直接描画する方が良いですか? (もしそうなら、それはどのように見えますか?)

ご協力いただきありがとうございます。

4

1 に答える 1

3

サイズの制約を設定していないため、ビューは表示されません。通常、ビューの位置とサイズを完全に表現するには、4 つの制約が必要です。ボタンなどの一部のビューには固有のコンテンツ サイズがあるため、サイズを明示的に設定する必要はありません。同じことが、表示する画像からサイズを取得する画像ビューにも当てはまります。

したがって、あなたの場合、幅と高さをスーパービューの幅と高さに等しく設定できます。これは私が頻繁に行うことなので、さまざまな制約メソッドを含む UIView のカテゴリを作成したので、これを何度も書く必要はありません。私はあなたがやりたいことをする1つのメソッドconstraintViewEqual:を持っています:

#import "UIView+RDConstraintsAdditions.h"

@implementation UIView (RDConstraintsAdditions)

-(void)constrainViewEqual:(UIView *) view {
    [view setTranslatesAutoresizingMaskIntoConstraints:NO];
    NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeCenterX relatedBy:0 toItem:view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
    NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeCenterY relatedBy:0 toItem:view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];
    NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:0 toItem:view attribute:NSLayoutAttributeWidth multiplier:1 constant:0];
    NSLayoutConstraint *con4 = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:0 toItem:view attribute:NSLayoutAttributeHeight multiplier:1 constant:0];
    NSArray *constraints = @[con1,con2,con3,con4];
    [self addConstraints:constraints];
}

次に、メイン コードで、次のように呼び出すことができます。

[self.view constrainViewsEqual:coordinatesView];
于 2013-01-19T23:44:16.797 に答える