1

デバイスでアプリケーションをテストしているときに、非常に奇妙な問題が発生します。ナビゲーションコントローラーに接続された2つのビューがあります。私の最初のビューは非常にシンプルで、UIButtonが1つあります。このボタンをクリックすると、2番目のビューに切り替わります。2番目のビューには、プログラムで作成されたUIButton(> 20)があります。問題があります。私の切り替えアニメーションの動作が(本来よりも)遅くなり、スパートが発生します。多くのUIButtonを使用して同じviewControllerを作成しようとしましたが、Interface Builderを使用して、アニメーションが正しく機能しています。この問題は、実際のデバイスでアプリケーションをテストしているときにのみ発生します。シミュレーターでは、このすべてのバリアントが正常に機能します。UI要素を作成するこの2つのバリエーションにいくつかの違いはありますか?そして、プログラムで多くのUI要素を使用してビューを作成することでこの問題をどのように解決できますか(私はこの方法を好みます)。

Edit1 スーパークラスがUIButtonであるクラスがあります。実装は次のとおりです。

#import <QuartzCore/QuartzCore.h>
#import "UIHouseButtons.h"

@implementation UIHouseButtons 

- (id)initWithFrame:(CGRect)frame
{  
self = [super initWithFrame:frame];
if (self) {
    self = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    UIImage *buttonImageNormal = [UIImage imageNamed:@"stateNormal.png"];
    UIImage *strechableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0];
    [self setBackgroundImage:strechableButtonImageNormal forState:UIControlStateNormal];
    UIImage *buttonImagePressed = [UIImage imageNamed:@"stateNormal.png"];
    UIImage *strechableButtonImagePressed = [buttonImagePressed stretchableImageWithLeftCapWidth:12 topCapHeight:0];
    [self setBackgroundImage:strechableButtonImagePressed forState:UIControlStateHighlighted];
    [[self layer] setCornerRadius:4.0f];
    [[self layer] setMasksToBounds:YES];
    [self.titleLabel setFont:[UIFont fontWithName:@"Times New Roman" size:15.0f]];
    self.frame = frame;
}
return self;
}

メソッドの2番目のViewControllerで-loadView

UIHouseButtons *homeButton = [[UIHouseButtons alloc] initWithFrame:CGRectMake(435.0f, 5.0f, 40.0f, 25.0f)];
[homeButton setTitle:@"H" forState:UIControlStateNormal];
[self.view addSubview:homeButton];

そして同じ20回。

編集2UIButtonsクラスを編集しました。

- (id)init
{
self = [super init];
if (self) {
    self = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    //self.backgroundColor = [UIColor clearColor];
    UIImage *buttonImageNormal = [UIImage imageNamed:@"stateNormal.png"];
    UIImage *strechableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0];
    [self setBackgroundImage:strechableButtonImageNormal forState:UIControlStateNormal];
    UIImage *buttonImagePressed = [UIImage imageNamed:@"stateNormal.png"];
    UIImage *strechableButtonImagePressed = [buttonImagePressed stretchableImageWithLeftCapWidth:12 topCapHeight:0];
    [self setBackgroundImage:strechableButtonImagePressed forState:UIControlStateHighlighted];
    [[self layer] setCornerRadius:4.0f];
    [[self layer] setMasksToBounds:YES];
    [self.titleLabel setFont:[UIFont fontWithName:@"Times New Roman" size:15.0f]];
    self.layer.shouldRasterize = YES;
    self.layer.rasterizationScale = [[UIScreen mainScreen] scale];
}
return self;
}

私の-viewDidLoad

- (void)viewDidLoad
{
[super viewDidLoad];
self.button1 = [[UIHouseButtons alloc] init];
self.button2 = [[UIHouseButtons alloc] init];
self.button3 = [[UIHouseButtons alloc] init];
self.button4 = [[UIHouseButtons alloc] init];
//and more 20 times

[self.view addSubview:self.button1];
[self.view addSubview:self.button2];
[self.view addSubview:self.button3];
[self.view addSubview:self.button4];
//and more 20 times
}

私のviewWillAppear

-(void)viewWillAppear:(BOOL)animated {
[self.button1 setFrame:CGRectMake(13.0f, 5.0f, 30.0f, 30.0f)];
[self.button2 setFrame:CGRectMake(57.0f, 5.0f, 30.0f, 30.0f)];
[self.button3 setFrame:CGRectMake(99.0f, 5.0f, 30.0f, 30.0f)];
[self.button4 setFrame:CGRectMake(141.0f, 5.0f, 30.0f, 30.0f)];
//and more 20 times
[super viewWillAppear:animated];
}
4

1 に答える 1

3

シミュレーターはiPhone/iPadのシミュレーターですが、iPhone / iPadのハードウェアのエミュレーターではなく、コンピューターのCPUとRAMを使用するため、シミュレーターの速度に問題はありません。
プログラムで実行するときにいくつかのルールを尊重する限り、コントロールの作成のパフォーマンスに違いはありません。これらは次のとおり
です。nibファイルを使用していない場合は、メソッド-loadViewをオーバーライドし、そこで作成しUIViewて設定するだけです。にself.view
次に、-viewDidLoadメソッド初期化でビュー階層を作成します-のサブビューself.view、それらのサブビュー(ボタン/ラベルなど)。フレーム値をハードコーディングしている場合は、ここで設定できますが、この方法ではビュー階層ジオメトリがまだ正しく設定されていないため、これを当てにしないでください。その後、-viewWillAppear:animatedメソッドはすべてのジオメトリを調整し、軽量の操作のみを実行します。これは、このメソッドができるだけ速く戻る必要があるためです(そうしないと、表示時にグリッチが発生する可能性があります)。
更新:
コードスニペットの更新から、ボタンのレイヤーの角が丸くなっていることがわかります。これは、特にボタンがUIScrollViewにある場合、パフォーマンスの問題になる可能性があります。UIHouseButtons.mすべてのボタンのレイヤーをファイルにラスタライズするように設定します

self.layer.rasterizationScale = [[UIScreen mainScreen] scale]; //Add this if using images to adjust the proper rasterization scale for them.
self.layer.shouldRasterize = YES;
于 2012-06-18T11:19:26.540 に答える