2011-11-07 11 views
2

私はUIAlerViewをサブクラス化することによって、そのようなカスタマイズを提出する準備をしています。レイアウトはUIAlertViewの与えられた地形に完全に基づいており、プライベートプロパティを読み取ることはできません。このようなカスタマイズはApp Storeのレビュープロセスで受け入れられますか?UIAlertViewのカスタマイズはAppleによって許可されていますか?

enter image description here

BGAlertViewWithSwitch.h

// 
// BGAlertViewWithSwitch.h 
// BGAlertViewWithSwitch 
// 
// Created by Borbas Geri on 11/7/11. 
// Copyright 2011 ©ompactApps. All rights reserved. 
// 

#import <Foundation/Foundation.h> 


//An assumed value. 
#define ALERT_VIEW_LINE_HEIGHT 20.0 
#define ALERT_VIEW_LABEL_PADDING 5.0 
#define ALERT_VIEW_LABEL_ALPHA 0.5 

#define kAlertSwitchLabelTag 42 


@interface BGAlertViewWithSwitch : UIAlertView 
{ 
    UISwitch *_alertSwitch; 
    UILabel *_alertSwitchLabel; 
} 
@property (nonatomic, retain) UISwitch *alertSwitch; 
@property (nonatomic, retain) UILabel *alertSwitchLabel; 
@property (nonatomic, readonly, getter=isOn) BOOL on; 

-(id)initWithTitle:(NSString*) title 
      message:(NSString*) message 
    switchMessage:(NSString*) switchMessage 
      delegate:(id) delegate 
cancelButtonTitle:(NSString*) cancelButtonTitle 
    okButtonTitle:(NSString*) okButtonTitle; 

@end 

BGAlertViewWithSwitch.m

// 
// BGAlertViewWithSwitch.m 
// BGAlertViewWithSwitch 
// 
// Created by Borbas Geri on 11/7/11. 
// Copyright 2011 ©ompactApps. All rights reserved. 
// 


#import "BGAlertViewWithSwitch.h" 


@implementation BGAlertViewWithSwitch 
@synthesize alertSwitch = _alertSwitch; 
@synthesize alertSwitchLabel = _alertSwitchLabel; 


#pragma mark - UISwitch Accessor 

-(BOOL)isOn 
{ 
    return self.alertSwitch.isOn; 
} 


#pragma mark - View lifecycle 

-(id)initWithTitle:(NSString*) title 
      message:(NSString*) message 
    switchMessage:(NSString*) switchMessage 
      delegate:(id) delegate 
cancelButtonTitle:(NSString*) cancelButtonTitle 
    okButtonTitle:(NSString*) okButtonTitle 
{ 

    //For testing layout 
    NSString *placeHolder = @""; 

    //Append a line to the message that leaves the place for the switch. 
    NSString *_expandedMessage = [NSString stringWithFormat:@"%@\n%@\n%@\n", message, placeHolder, placeHolder]; 

    if (self = [self initWithTitle:title 
          message:_expandedMessage 
          delegate:delegate 
       cancelButtonTitle:cancelButtonTitle 
       otherButtonTitles:okButtonTitle, nil]) 
    { 
     //Add switch. 
     self.alertSwitch = [[UISwitch alloc] init]; 
     self.alertSwitch.on = YES; 
     [self addSubview:self.alertSwitch]; 

     //Add label. 
     self.alertSwitchLabel = [[UILabel alloc] init]; 
     self.alertSwitchLabel.text = switchMessage; 
     self.alertSwitchLabel.tag = kAlertSwitchLabelTag; 
     [self addSubview:self.alertSwitchLabel]; 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    self.alertSwitch = nil; 
    self.alertSwitchLabel = nil; 

    [super dealloc]; 
} 


#pragma mark - Topography 

- (void)layoutSubviews 
{ 
    NSLog(@"layoutSubviews to (%@)", NSStringFromCGRect(self.frame)); 

    //Weak link to the message label. 
    UILabel *messageLabel; 

    //Enumerate subviews to find message label (the base of the topography). 
    for (UIView *eachSubview in self.subviews) 
     if ([[eachSubview class] isEqual:[UILabel class]]) 
     { 
      UILabel *eachLabel = (UILabel*)eachSubview; 
      if (eachLabel.tag != kAlertSwitchLabelTag) 
      { 
       messageLabel = eachLabel; 
       NSLog(@"Each label frame (%@), saying '%@'", NSStringFromCGRect(eachLabel.frame), eachLabel.text);     
      } 
     } 

    //Center new content. 
    CGSize alertSwitchLabelSize = [self.alertSwitchLabel.text sizeWithFont:messageLabel.font]; 
    float horizontalCentering = (messageLabel.frame.size.width - (alertSwitchLabelSize.width + ALERT_VIEW_LABEL_PADDING + self.alertSwitch.frame.size.width))/2; 


    //Switch goes to the bottom right. 
    float switchVerticalCentering = ((ALERT_VIEW_LINE_HEIGHT * 2 + 1) - self.alertSwitch.frame.size.height)/2; 
    CGRect alertSwitchFrame = CGRectMake(messageLabel.frame.origin.x + messageLabel.frame.size.width - self.alertSwitch.frame.size.width - horizontalCentering, 
             messageLabel.frame.origin.y + messageLabel.frame.size.height - self.alertSwitch.frame.size.height - switchVerticalCentering, 
             self.alertSwitch.frame.size.width, 
             self.alertSwitch.frame.size.height); 
    self.alertSwitch.frame = alertSwitchFrame; 

    //Label goes to the bottom left.  
    float switchLabelVerticalCentering = ((ALERT_VIEW_LINE_HEIGHT * 2 + 1) - ALERT_VIEW_LINE_HEIGHT)/2; 
    CGRect alertSwitchLabelFrame = CGRectMake(round(messageLabel.frame.origin.x + horizontalCentering), 
               round(messageLabel.frame.origin.y + messageLabel.frame.size.height - ALERT_VIEW_LINE_HEIGHT - switchLabelVerticalCentering), 
               messageLabel.frame.size.width - self.alertSwitch.frame.size.width, 
               ALERT_VIEW_LINE_HEIGHT); //self.alertSwitchLabel.frame.size.height); 
    self.alertSwitchLabel.frame = alertSwitchLabelFrame; 

    //Copy message label properties. 
    self.alertSwitchLabel.backgroundColor = [UIColor clearColor]; 
    self.alertSwitchLabel.textColor = messageLabel.textColor; 
    self.alertSwitchLabel.font = messageLabel.font; 
    self.alertSwitchLabel.shadowColor = messageLabel.shadowColor; 
    self.alertSwitchLabel.shadowOffset = messageLabel.shadowOffset; 

    //Weaken. 
    self.alertSwitchLabel.alpha = ALERT_VIEW_LABEL_ALPHA; 

    [super layoutSubviews]; 
} 


@end 
+0

をねえ、ちょうど質問を。私のプロジェクトでコードを使用することはできますか?私はまったく同じことが必要です。ありがとうございました – Youssef

答えて

3

誰が、Appleは適切にこの質問に答えることができますので、最善のことはテストにそれを置くことです。私は、あなた自身に尋ねなければならない主な質問は、Apple Developer Agreementで何らかの条項に違反しているのでしょうか?そうでない場合は、アプリを提出してください。あなたが拒絶を心配している場合は、バックアップとしてこれを行うことができる別の方法を考えて、問題の場合に提出する準備をしてください。

あなたは尋ねたことはありませんが、Appleのデザインへのこの変更は直感的ではありません。 「moquusからも削除しますか?」という意味に切り替えることを意味しますか?そこに大きな削除ボタンがあるので。スイッチがオフの場合、削除ボタンは何を削除しますか?

+0

すごく、ありがとう。私は単語 "も"を含めます。ちなみに、私はこのページをアップルに質問して投稿しました。すぐに答えが出ます。 – Geri

+0

上記のスクリーンショットの言葉を変更しました。 :) – Geri

+0

これはあまりにも自然ではありませんが、最初からUIAlertViewを作成するよりも優れています。 – Geri

4

質問に対する実際の答えは、ではありません - AppleはUIAlertViewをサブクラス化することはできません。 UIAlertViewのドキュメントから:

サブクラスノート

UIAlertViewクラスは、そのままではなく サポートサブクラス化を行い使用することを意図しています。このクラスのビュー階層はプライベートで、 は変更しないでください。

ここで見つける: Subclassing UIAlertView

関連する問題