我知道可以定义响应给定协议的Class属性,例如:
Class <MyProtocol> class = [object class];
Run Code Online (Sandbox Code Playgroud)
但是在Objective-C中是否有任何方法可以将Class类型转换为我的类?
Class unknownClass = [object class];
[((MyClass)unknownClass) myMethod]; // How can I cast Class to MyClass?
Run Code Online (Sandbox Code Playgroud) 让我向您展示一些获得三个UIColors的色调,饱和度和亮度的结果.
[[UIColor redColor] getHue:&hue
saturation:&saturation
brightness:&brightness
alpha:&alpha];
hue = 1.0 saturatino = 1.0 brightness = 1.0 alpha = 0.0
Run Code Online (Sandbox Code Playgroud)
[[UIColor whiteColor] getHue:&hue
saturation:&saturation
brightness:&brightness
alpha:&alpha];
hue = 0.0 saturatino = 0.0 brightness = 0.0 alpha = 0.0
Run Code Online (Sandbox Code Playgroud)
[[UIColor blackColor] getHue:&hue
saturation:&saturation
brightness:&brightness
alpha:&alpha];
hue = 0.0 saturatino = 0.0 brightness = 0.0 alpha = 0.0
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么色调,饱和度,白色和黑色的亮度相等?为什么alpha等于零?
我想在我的项目中做的是通过改变它的亮度从给定的颜色生成"更暗"的颜色:
亮度=亮度*0.8;
它适用于任何颜色,但它从白色产生黑色.(虽然我希望有一种灰色).
我试图在通话期间模仿电话应用程序中的行为。您可以轻松地在扬声器或耳机之间切换输出源。我知道我可以在通过调用连接耳机时强制扬声器作为输出:
try! audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
try! audioSession.overrideOutputAudioPort(.speaker)
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我看不到任何方法来检测耳机是否仍连接到设备。
我最初认为outputDataSourcesAVAudioSession 会返回所有可能的输出,但它总是返回 nil。
有什么我想念的吗
我在使用 NSFetchedResultsController 时遇到了奇怪的行为。它是 iOS 10 中的新功能。直截了当:fetchedObjects包含重复的对象。
在我自己的标准中,这绝不是“重复”。它们实际上具有相同的 objectID 和相同的引用。
它是如何在我的应用程序中发生的:
FRC 已设置并执行提取
获取 2 个对象(在本例中)
我的同步层发生了一些事情,更新了另一个对象(获取项目与之相关)
FRC 调用delegate 表示内容确实发生了变化。fetchedObjects包含 4 个对象(2 个重复)
这是我在controllerDidChangeContent方法中调试的控制台输出。
po frc.fetchedObjects
- 0 : <ListItem: 0x1700dc3f0> (entity: ListItem; id: 0x1706294a0 <x-coredata://12D0CB00-7BF4-402A-8371-19DD1CFB1537/ListItem/t3384FC2D-3399-41FE-B7DD-C277922F495445> ; data: { ... }
- 1 : <ListItem: 0x1700dc3f0> (entity: ListItem; id: 0x1706294a0 <x-coredata://12D0CB00-7BF4-402A-8371-19DD1CFB1537/ListItem/t3384FC2D-3399-41FE-B7DD-C277922F495445> ; data: { ... }
- 2 : <ListItem: 0x1704c49f0> (entity: ListItem; id: 0x170631680 <x-coredata://12D0CB00-7BF4-402A-8371-19DD1CFB1537/ListItem/t3384FC2D-3399-41FE-B7DD-C277922F495446> ; data: { ... }
- 3 : <ListItem: …Run Code Online (Sandbox Code Playgroud) 我希望 UIScrollView 始终滚动回特定点。我已经通过写作实现了它:
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
(*targetContentOffset).x = 0.0f;
}
Run Code Online (Sandbox Code Playgroud)
除了一个例外,它工作得很好。当我滚动足够远并到达视图的末尾(然后开始弹跳)并向上拉我的手指时,视图会平滑地滚动并减速一点,然后停止然后跳转(没有动画)我设置的位置。只要我不滚动到滚动视图的末尾,它就不会发生。
这是我如何初始化 UIScrollView
scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 284, frame.size.height)];
scrollView.backgroundColor = [UIColor clearColor];
scrollView.delegate = self;
[scrollView setContentSize:CGSizeMake(285,frame.size.height)];
[self addSubview:scrollView];
UIEdgeInsets inset = scrollView.contentInset;
inset.left = 60;
inset.right = 60;
[scrollView setContentInset:inset];
Run Code Online (Sandbox Code Playgroud) 我的应用程序正在泄漏模型对象,因为对象正在保留保留视图本身的闭包。最好通过例子来说明。在下面的代码中,消失Model后并没有释放ContentView。
//
// Content View is an owner of `Model`
// It passes it to `ViewB`
//
// When button is tapped, ContentView executes action
// assigned to Model by the ViewB
//
struct ContentView: View {
@StateObject private var model = Model()
var body: some View {
VStack {
Button(action: {
model.action?()
}) {
Text("Tap")
}
ViewB(model: model)
}
.frame(width: 100, height: 100)
.onDisappear {
print("CONTENT DISAPPEAR")
}
}
}
struct ViewB: View {
@ObservedObject …Run Code Online (Sandbox Code Playgroud) 我是Reactive Cocoa的新手.我想要实现的是每次财产价值变化时都会收到通知.但是,当属性设置为相同值时,我不希望收到通知.这是一些代码:
self.testProperty = 0;
[[RACObserve(self, self.testProperty) skip:1] subscribeNext:^(id x) {
NSLog(@"Did Change: %@", x);
}];
self.testProperty = 1;
self.testProperty = 1;
self.testProperty = 1;
self.testProperty = 1;
self.testProperty = 1;
Run Code Online (Sandbox Code Playgroud)
这就是我在控制台输出上得到的结果
> Did Change: 1
> Did Change: 1
> Did Change: 1
> Did Change: 1
> Did Change: 1
Run Code Online (Sandbox Code Playgroud)
我预计"改变了"只打印一次,而不是五次.有没有办法只订阅新值?
我无法在 SwiftUI 中进行插入转换。
我有一个Group有条件地显示两个视图之一的视图。当我尝试为过渡设置动画时,删除过渡有效,但插入无效- 视图立即出现,没有任何动画。
我将其粘贴在我的视图代码下面。我怎样才能做到这一点? (Xcode 11.3.1)
struct TestView: View {
@State private var showView = false
var body: some View {
VStack {
Button(action: {
withAnimation {
self.showView.toggle()
}
}) {
Text("Tap")
}
Group {
if showView {
Color.red
.frame(width: 100, height: 100)
} else {
Color.blue
.frame(width: 100, height: 100)
.cornerRadius(50)
}
}
.transition(.asymmetric(insertion: .move(edge: .leading),
removal: .move(edge: .trailing)))
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
正如 @Asperi 在评论中指出的那样,代码是正确的,但是......它仅在真实设备上运行时才有效。Xcode 中的实时预览存在缺陷,并且显然不能很好地处理转换。
所以这个问题的答案很简单:在真机上测试!:)
我正在尝试anchorPreference在我的 VStack 中的某些视图上绘制覆盖图。然而,它只适用于最简单的情况。当我的 VStack 的内容变得稍微复杂一点时,就永远不会绘制覆盖层。
这是我的代码
struct debug_test: View {
@State private var someState = false
var body: some View {
VStack {
Text("Hello World !!!")
.anchorPreference(
key: BoundsPreferenceKey.self,
value: .bounds
) { $0 }
//////////////////////////////////////////////////////////
// When I remove below lines - it works ok.
// But when I put add some conditionally-visible view and one more view
// it stops drawing an overlay.
// Apparently, `preferences` is always nil in that case.
if someState {
Text("Pooop") …Run Code Online (Sandbox Code Playgroud) 我正在努力理解为什么sink底层代码中没有收到任何值。
func somePublisher() -> AnyPublisher<Bool, Never> {
let subject = PassthroughSubject<Bool, Never>()
subject.send(true)
subject.send(completion: .finished)
return subject.eraseToAnyPublisher()
}
somePublisher()
.first()
.sink { _ in
print("Completed")
} receiveValue: {
print("Received \($0)")
}
.store(in: &sinks)
Run Code Online (Sandbox Code Playgroud)
输出:
完全的
如果在连接之前完成,下游的发布者似乎不会收到值。是对的吗?如果我的发布商可以同步完成,我该如何解决这个问题?
由于我在尝试将混合滤镜应用于图像并显示它时遇到的崩溃,我感到头疼.我想要做的只是将叠加图像放到另一个图像上.
这是我的代码:
- (GPUImageOutput<GPUImageInput> *)myFilter
{
GPUImageFilterGroup *filtersGroup = [GPUImageFilterGroup new];
// Saturation
GPUImageSaturationFilter *saturationFilter = [GPUImageSaturationFilter new];
saturationFilter.saturation = 0.0;
[filtersGroup addFilter:saturationFilter];
// Noise
UIImage *noiseImage = [UIImage imageNamed:@"noise.png"];
GPUImagePicture *noisePicture = [[GPUImagePicture alloc] initWithImage:noiseImage];
GPUImageAddBlendFilter *blend = [GPUImageAddBlendFilter new];
[blend useNextFrameForImageCapture];
[filtersGroup addFilter:blend];
[noisePicture addTarget:blend atTextureLocation:1];
[noisePicture processImage];
[saturationFilter addTarget:blend];
filtersGroup.initialFilters = @[saturationFilter];
filtersGroup.terminalFilter = blend;
return filtersGroup;
}
Run Code Online (Sandbox Code Playgroud)
// Applying filter
GPUImageOutput <GPUImageInput> *effect = [self myFilter];
self._photoHandle = [[GPUImagePicture alloc] initWithImage:staticImage];
[self._photoHandle addTarget:effect];
[effect addTarget:self.targetPreviewView];
[self._photoHandle …Run Code Online (Sandbox Code Playgroud) 我正在合并两个出版商:
let timer = Timer.publish(every: 10, on: .current, in: .common).autoconnect()
let anotherPub: AnyPublisher<Int, Never> = ...
Publishers.CombineLatest(timer, anotherPub)
.sink(receiveValue: (timer, val) in {
print("Hello!")
} )
Run Code Online (Sandbox Code Playgroud)
不幸的是,直到两个发布者都发出至少一个元素时才会调用 sink。
有没有办法让接收器在不等待所有发布者的情况下被调用?因此,如果任何发布者发出一个值,则会调用 sink 并将其他值设置为 nil。
ios ×8
cocoa ×3
swift ×3
swiftui ×3
animation ×2
combine ×2
avfoundation ×1
casting ×1
class ×1
cocoa-touch ×1
core-data ×1
gpuimage ×1
ios10 ×1
ios5 ×1
iphone ×1
macos ×1
objective-c ×1
scroll ×1
transition ×1
uikit ×1
uiscrollview ×1