외모When Contained In In In Swift
저는 제 앱을 스위프트 언어로 전환하려고 합니다.
코드 라인은 다음과 같습니다.
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
setTitleTextAttributes:textDictionary
forState:UIControlStateNormal];
스위프트로 변환하는 방법은?
애플 문서에는 그런 방법이 없습니다.
iOS 9 업데이트:
iOS 9+를 목표로 한다면(Xcode 7 b1 기준), 새로운 방법이 있습니다.UIAppearancevarrags를 사용하지 않는 protocol:
static func appearanceWhenContainedInInstancesOfClasses(containerTypes: [AnyObject.Type]) -> Self
다음과 같이 사용할 수 있습니다.
UITextField.appearanceWhenContainedInInstancesOfClasses([MyViewController.self]).keyboardAppearance = .Light
iOS 8 또는 이전 버전을 지원해야 하는 경우 이 질문에 대해 다음과 같은 원래 답변을 사용합니다.
iOS 8 및 7의 경우:
이러한 메서드는 Obj-C 변수 메서드가 Swift와 호환되지 않으므로 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
—
// UIAppearance+Swift.m
#import "UIAppearance+Swift.h"
@implementation UIView (UIViewAppearance_Swift)
+ (instancetype)my_appearanceWhenContainedIn:(Class<UIAppearanceContainer>)containerClass {
return [self appearanceWhenContainedIn:containerClass, nil];
}
@end
꼭 해주세요.#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
ios 10 swift 3
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "Kapat"
iOS 8 및 7의 경우:
저는 여러 개의 컨테이너를 지정하기 위해 알렉스의 답변에 기반한 카테고리를 사용합니다.이것은 애플이 공식적으로 지원할 때까지 피할 수 있는 방법입니다.appearanceWhenContainedIn스위프트에서
UIA외관+Swift.h
@interface UIView (UIAppearance_Swift)
/// @param containers An array of Class<UIAppearanceContainer>
+ (instancetype)appearanceWhenContainedWithin: (NSArray *)containers;
@end
UIA외모+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
그다음에 추가합니다.#import "UIAppearance+Swift.h"당신의 브리징 헤더에.
Swift에서 사용하는 방법:
TextField.appearanceWhenContainedWithin([MyViewController.self, TableViewController.self]).keyboardAppearance = .Light
CVarArgType을 사용할 수 있는 방법을 찾을 수 있다면 좋았지만, 깨끗한 해결책을 찾지 못했습니다.
여기 @tdun에서 영감을 받은 덜 못생겼지만 여전히 추한 해결책이 있습니다.
- Objective-C 외관을 유지할 클래스를 만듭니다.이 예제의 목적을 위해, 이 예라고 합시다.
AppearanceBridger. - 이 클래스를 브리지 헤더에 추가합니다.브리징 헤더가 없는 경우 작성합니다.
- 클래스 메서드 만들기
AppearanceBridger이름 지어진+(void)setAppearance그리고 이 방법에 Objective-C 외관 코드를 입력합니다.예를 들어,
+ (void)setAppearance {
[[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setBackgroundColor:[UIColor whiteColor]];
}
- 외관을 설정하는 스위프트 코드에서 호출합니다.
AppearanceBridger.setAppearance()당신은 잘 가야 합니다!
이것이 보는 사람들에게 효과가 있기를 바랍니다.
여기 제가 사용한 추악한 해결책이 있습니다.
원하는 대로 이름을 지정하는 Objective-C Cocoa Touch Class(UIViewController)를 만들기만 하면 됩니다.
제 이름을 지었습니다.WorkaroundViewController...
지금()에WorkaroundViewController.m):
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
다음에 대한 Objective-C 외관 코드 실행.appearanceWhenContainedIn()(여기 예가 있습니다)
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"Avenir-Light" size:16.0f]}];
그런 다음 Swift 프로젝트에 대한 브리징 헤더를 작성한 다음 Swift 코드에서 Objective-C View Controller를 초기화합니다. 다음과 같이 예를 들어 설명합니다.
var work : WorkaroundViewController = WorkaroundViewController()
그럼 끝!그게 당신에게 도움이 된다면 제게 알려주세요...내가 말했듯이, 못생겼지만 효과는 있어요!
이는 UI 보기뿐만 아니라 UI 외관 프로토콜을 준수하는 모든 클래스로 확장될 수 있습니다.다음은 좀 더 일반적인 버전입니다.
UIA외관+Swift.h
#import <UIKit/UIKit.h>
@interface NSObject (UIAppearance_Swift)
+ (instancetype)appearanceWhenContainedWithin:(Class<UIAppearanceContainer>)containerClass;
@end
UIA외모+Swift.m
#import "UIAppearance+Swift.h"
@implementation NSObject (UIAppearance_Swift)
+ (instancetype)appearanceWhenContainedWithin:(Class<UIAppearanceContainer>)containerClass {
if ([self conformsToProtocol:@protocol(UIAppearance)]) {
return [(id<UIAppearance>)self appearanceWhenContainedIn:containerClass, nil];
}
return nil;
}
@end
사용하고 싶은 여러분을 위해 레포를 만들었습니다.CocoaPods:
이것을 당신의 것에 추가합니다.
Podfile:pod 'UIViewAppearanceSwift'클래스에 가져오기:
import UIViewAppearanceSwift func layout() { UINavigationBar.appearanceWhenContainedWithin(MFMailComposeViewController.self).barStyle = .Black UIBarButtonItem.appearanceWhenContainedWithin(UISearchBar.self).setTitleTextAttributes([NSFontAttributeName: UIFont.systemFontOfSize(15)], forState: UIControlState.Normal) }참조 : https://github.com/levantAJ/UIViewAppearanceSwift
스위프트 4: iOS 9+
UIProgressView.appearance(whenContainedInInstancesOf: [LNPopupBar.self]).tintColor = .red
스위프트(적어도 베타5 기준)는 제가 모르는 이유로 지원하지 못하는 것 같습니다.아마도 필요한 언어 기능은 아직 진행 중인 것 같습니다. 그럴만한 이유로 인터페이스에서 제외한 것으로 추정할 수 밖에 없습니다.말씀하신 것처럼 문서에 따르면 ObjC에서 아직 사용 가능합니다.정말 실망스럽습니다.
다음을 사용할 수 있습니다.
UIBarButtonItem.appearance().setTitleTextAttributes(textDictionary, forState: UIControlState.Normal)
편집 : 외관포함된 경우스위프트에서 인을 제거했습니다.이 답변은 베타 5가 모든 막대 버튼의 텍스트 모양을 변경하는 것이었습니다.
당신은 그냥 번역할 수 있어야 합니다.Objective-C구문 분석을 하다Swift통사론
신속하게 방법을 다음과 같이 선언해야 합니다.
func appearanceWhenContainedIn(containerClass : <UIAppearanceContainer>)
func setTitleTextAttributes(_ attributes: NSDictionary!, forState state: UIControlState)
이렇게 해볼 수 있습니다.
UIBarButtonItem.appearanceWhenContainedIn(UINavigationBar).setTitleTextAttributes(textDictionary, forState: UIControlStateNormal)
저는 이것이 수업 방법을 호출하는 깨끗한 방법인지 여전히 파악해야 합니다.Swift그래도.
이게 도움이 됐으면 좋겠네요
언급URL : https://stackoverflow.com/questions/24136874/appearancewhencontainedin-in-swift
'programing' 카테고리의 다른 글
| C에서 MP3 파일을 재생하는 방법은? (0) | 2023.10.26 |
|---|---|
| 노드에서 글로벌 모듈을 가져오려면 어떻게 해야 합니까?"Error: Can't find module(오류: 모듈을 찾을 수 없음)"이라는 메시지가 표시됩니까 (0) | 2023.10.21 |
| 점선 테두리 점 사이의 간격을 늘리는 방법 (0) | 2023.10.21 |
| 삽입 시 외국 키 테이블에 고유 레코드 삽입 (0) | 2023.10.21 |
| 패키지/프로시저 외부에서 Oracle 연관 배열 유형을 생성할 수 있습니까? (0) | 2023.10.21 |