Ale*_*xZd 124 ios uiappearance swift
我正在尝试将我的应用程序转换为Swift语言.
我有这行代码:
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
setTitleTextAttributes:textDictionary
forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)
如何将其转换为Swift?
在Apple的文档中,没有这样的方法.
Ale*_*lav 229
如果您的目标是iOS 9+(从Xcode 7 b1开始),UIAppearance协议中有一种新方法不使用varargs:
static func appearanceWhenContainedInInstancesOfClasses(containerTypes: [AnyObject.Type]) -> Self
Run Code Online (Sandbox Code Playgroud)
哪个可以这样使用:
UITextField.appearanceWhenContainedInInstancesOfClasses([MyViewController.self]).keyboardAppearance = .Light
Run Code Online (Sandbox Code Playgroud)
如果您仍需要支持iOS 8或更早版本,请使用以下原始答案来解决此问题.
这些方法不适用于Swift,因为Obj-C varargs方法与Swift不兼容(请参阅http://www.openradar.me/17302764).
我编写了一个非可变的解决方法,它在Swift中工作(我重复了相同的方法UIBarItem,但不是从下面开始UIView):
// UIAppearance+Swift.h
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIView (UIViewAppearance_Swift)
// appearanceWhenContainedIn: is not available in Swift. This fixes that.
+ (instancetype)my_appearanceWhenContainedIn:(Class<UIAppearanceContainer>)containerClass;
@end
NS_ASSUME_NONNULL_END
Run Code Online (Sandbox Code Playgroud)
-
// UIAppearance+Swift.m
#import "UIAppearance+Swift.h"
@implementation UIView (UIViewAppearance_Swift)
+ (instancetype)my_appearanceWhenContainedIn:(Class<UIAppearanceContainer>)containerClass {
return [self appearanceWhenContainedIn:containerClass, nil];
}
@end
Run Code Online (Sandbox Code Playgroud)
请确保#import "UIAppearance+Swift.h"在您的桥接标题中.
然后,从Swift调用(例如):
# Swift 2.x:
UITextField.my_appearanceWhenContainedIn(MyViewController.self).keyboardAppearance = .Light
# Swift 3.x:
UITextField.my_appearanceWhenContained(in: MyViewController.self).keyboardAppearance = .light
Run Code Online (Sandbox Code Playgroud)
小智 31
ios 10 swift 3
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "Kapat"
Run Code Online (Sandbox Code Playgroud)
Yoi*_*aya 14
我使用基于Alex答案的类别来指定多个容器.这是一个解决方法,直到Apple正式支持appearanceWhenContainedInSwift.
UIAppearance + Swift.h
@interface UIView (UIAppearance_Swift)
/// @param containers An array of Class<UIAppearanceContainer>
+ (instancetype)appearanceWhenContainedWithin: (NSArray *)containers;
@end
Run Code Online (Sandbox Code Playgroud)
UIAppearance + Swift.m
@implementation UIView (UIAppearance_Swift)
+ (instancetype)appearanceWhenContainedWithin: (NSArray *)containers
{
NSUInteger count = containers.count;
NSAssert(count <= 10, @"The count of containers greater than 10 is not supported.");
return [self appearanceWhenContainedIn:
count > 0 ? containers[0] : nil,
count > 1 ? containers[1] : nil,
count > 2 ? containers[2] : nil,
count > 3 ? containers[3] : nil,
count > 4 ? containers[4] : nil,
count > 5 ? containers[5] : nil,
count > 6 ? containers[6] : nil,
count > 7 ? containers[7] : nil,
count > 8 ? containers[8] : nil,
count > 9 ? containers[9] : nil,
nil];
}
@end
Run Code Online (Sandbox Code Playgroud)
然后添加#import "UIAppearance+Swift.h"到您的桥接标题.
要从Swift中使用:
TextField.appearanceWhenContainedWithin([MyViewController.self, TableViewController.self]).keyboardAppearance = .Light
Run Code Online (Sandbox Code Playgroud)
如果我能找到一种使用CVarArgType的方法很好,但我发现没有干净的解决方案.
Bau*_*aub 12
这是一个不那么丑陋,但仍然很丑陋的解决方案,受到@tdun的启发.
AppearanceBridger.AppearanceBridgernamed中创建一个类方法,并将+(void)setAppearanceObjective-C外观代码放在此方法中.例如:
+ (void)setAppearance {
[[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setBackgroundColor:[UIColor whiteColor]];
}
AppearanceBridger.setAppearance(),你应该好好去!希望这适用于看到它的人.
| 归档时间: |
|
| 查看次数: |
37963 次 |
| 最近记录: |