title: Is customizing UIAlertView is allowed by Apple?
body: <p>I'm preparing to submit such a customization by subclassing UIAlerView. It's layout is entirely based on the given topography of the UIAlertView, have no read any private property. Is this kind of customization acceptable by App Store review process?</p>
  
  <p><img src="https://i.stack.imgur.com/JwwfL.png" alt="enter image description here"></p>
  
  <p>BGAlertViewWithSwitch.h</p>
  
  <pre><code>//
  //  BGAlertViewWithSwitch.h
  //  BGAlertViewWithSwitch
  //
  //  Created by Borbas Geri on 11/7/11.
  //  Copyright 2011 ©ompactApps. All rights reserved.
  //
  
  #import &lt;Foundation/Foundation.h&gt;
  
  
  //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
  </code></pre>
  
  <p>BGAlertViewWithSwitch.m</p>
  
  <pre><code>//
  //  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
  </code></pre>