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?
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
No one but Apple can adequately answer this question, so the best thing is to put it to the test. I think the main question you have to ask yourself is: Have I violated any provisions in the Apple Developer Agreement? If not, then submit your app. If you are worried about rejection, think of another way in which this could be done, as a backup, and be prepared to submit that in case of a problem.
Not that you have asked, but I would also opine that this change to Apple's design is not very intuitive. Do you mean the switch to mean "also delete from moquus?" as you already have a big delete button there. If the switch is off, then what does the delete button delete?